学习Kotlin~扩展

这篇具有很好参考价值的文章主要介绍了学习Kotlin~扩展。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

扩展

扩展函数

  • 扩展可以在直接修改类定义的情况下增加类功能
  • 扩展可以用于自定义类,比如List、String,以及Kotlin标准库里的其他类
  • 和继承相似,扩展也能共享类型行为
  • 当你无法接触某个类定义,或者某个类没有使用open修饰符,导致你无法继承它时,扩展是增加类功能最好选择

如何定义扩展函数

  • 和定义一般函数差不多
  • 需要指定接受功能扩展的接受者类型
	/**
	 * 定义扩展函数和定义一般函数差不多,有一点不同
	 * 你还需要指定接受功能扩展的接受者类型
	 */
	
	//定义下面的扩展函数,这里不单指定了方法名,还指定了接受者类型是String
	fun String.addExt(amount: Int = 1) = this + "!".repeat(amount);
	
	fun main() {
	
	}

泛型扩展函数

  • 新的泛型扩展函数不仅可以支持任何类型的接受者,还保留了接受者的类型信息
	//定义泛型扩展函数
	fun <T> T.easyPrintln1(): T {
	    println(this);
	    return this;
	}

扩展属性

	/**
	 * 给类定义扩展属性
	 * 扩展属性也没有真的为该类添加了属性,只能说是为该类经过get、set方法计算出属性。
	 */
	var String.Vowels
	    get() = count { "aeiouy".contains(it) };
	    set(value) {
	        //这里没法真正改变这个扩展属性的值,因为没有真正为该类添加属性
	    }
	
	
	fun main() {
	    println("abc".Vowels)
	    "abc".Vowels = 123456;
	    println("abc".Vowels)
	}

可控类扩展

  • 可控类扩展,可以定义扩展函数用于可控类扩展,在可空类型上定义扩展函数,
  • 你就可以直接在扩展函数体内解决可能出现的空值问题
	/**
	 * 可控类扩展,可以定义扩展函数用于可控类扩展,在可空类型上定义扩展函数,
	 * 你就可以直接在扩展函数体内解决可能出现的空值问题
	 */
	
	fun String?.printWithDefault(default: String) = println(this ?: default);
	
	fun main() {
	    val nullableString: String? = null;
	    //这里如果为null,那么就会打印默认的值
	    nullableString.printWithDefault("qwe");
	    //如果不定义可空函数扩展,那么就要使用安全操作符?,结果就是不执行,什么都不打印
	    nullableString?.printWithDefault("qwe");
	}

infix关键字

	/**
	 * infix关键字适用于有单个参数的扩展和类函数,
	 * 可以让你一更简洁的语法调用函数
	 * 如果一个函数定义使用了infix关键字,
	 * 那么调用它时,接受者和函数之间的点操作以及参数的一对括号都可以不要
	 */
	
	infix fun String.extPrintln(value: String) = println(value);
	
	fun main() {
	    "abcdefg" extPrintln "使用infix参数的括号可以省略";
	}

定义扩展文件

  • 扩展函数需要在单独的文件使用,可以将它定义在单独的文件里面,然后import

比如下面的kotlin文件;

	/**
	 * 扩展函数需要在多个文件里面使用,可以将它定义在单独的文件,然后import
	 */
	package ohos.samples.kotlin18
	
	fun <T> Iterable<T>.randomTake(): T = this.shuffled().first();

在另一个kotlin文件中使用;文章来源地址https://www.toymoban.com/news/detail-527501.html

	//这里使用的话就用import引入
	import ohos.samples.kotlin18.randomTake
	
	fun main() {
	    val list = listOf<String>("Jason", "Jack", "Tom")
	    val set = listOf<String>("love", "hate", "like")
	    println(list.randomTake());
	}

重命名扩展

	//重命名扩展
	//有时候你想使用一个类的扩展,但它的名字不如你的意,可以使用as重命名扩展
	import ohos.samples.kotlin18.randomTake as randomizer
	
	fun main() {
	    val list = listOf<String>("Jason", "Jack", "Tom")
	    val set = listOf<String>("love", "hate", "like")
	    println(list.randomizer());
	}

到了这里,关于学习Kotlin~扩展的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kotlin基础(六) 枚举类和扩展

    本文主要讲解kotlin枚举类和扩展 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 1.1.1 枚举类的基本用法 Kotlin中的枚举类(enum class)用于定义一组具有预定义值的常量。它们在许多情况下都很有用,例如表示一组相关的选项、状态或命名常量集合。下面是Kotlin枚举类的基本用

    2024年02月16日
    浏览(19)
  • kotlin的扩展函数“let、run、also、apply”的作用和区别

    Kotlin的扩展函数 let 、 run 、 also 、 apply 都是用于简化代码的工具,它们可以在不修改原始类或对象的情况下添加新的功能和行为。下面是它们的作用和区别: let :用于对一个可空对象进行操作,避免出现空指针异常。它会将对象作为lambda表达式的参数传递,并返回lambda表达

    2024年02月14日
    浏览(33)
  • 【Kotlin】DSL 领域特定语言 ( apply 标准库函数分析 | 普通匿名函数 | 扩展匿名函数 | 泛型扩展匿名函数 )

    本章总结 : 读懂 apply 标准库函数 核心是其 block: T.() - Unit 参数 , 这是 泛型扩展匿名函数 ; 泛型扩展匿名函数 T.() - Unit 演变路径 : 普通匿名函数 : () - Unit , 这个函数 参数 和 返回值 都为空 ; 扩展匿名函数 : String.() - Unit , 这个函数 是 为 具体的 String 类型定义的扩展函数 ; 泛型

    2023年04月09日
    浏览(29)
  • 【Kotlin】函数式编程 ③ ( 早集合与惰性集合 | 惰性集合-序列 | generateSequence 序列创建函数 | 序列代码示例 | take 扩展函数分析 )

    及早集合 与 惰性集合 : 及早集合 : Eager Collection , 指的是 List , Map , Set 等集合 , 这些集合创建后 , 需要 将元素提前存储到集合中 , 然后才能访问 ; 惰性集合 : Lazy Collection , 在 集合刚创建时不必将集合元素放进去 , 当使用这些元素时才生成 , 这些 集合元素按需产生 ; 在 惰性集

    2024年02月02日
    浏览(94)
  • Android---Kotlin 学习009

    在 java 里如果一个类没有被 final 修饰,那么它都是可以被继承的。而在 kotlin 中,类默认都是封闭的,要让某个类开放继承,必须使用 open 修饰它,否则会编译报错。此外在子类中,如果要复写父类的某个方法,需要用到 Override (在 kt 中就不是注解了)

    2024年02月01日
    浏览(30)
  • 学习Kotlin~函数

    函数参数 不打算传入值参,可以预先给参数指定默认值 有名的函数值参,如果使用命名值参,可以不用管值参的顺序 参数的顺序相反了,也不会影响最终结果。 Unit函数 Kotlin中没有返回值的函数叫Unit函数。 Nothing类型 TODO函数的任务就是抛出异常,就是永远别指望它能运行成

    2024年02月11日
    浏览(28)
  • Kotlin基础学习-入门篇

    本篇文章来自郭霖大佬的第一行代码中的 Kotlin 教程,笔者只是在学习 Kotlin 过程中记录学习过程。 Kotlin系列已更新: Kotlin基础学习-入门篇 Kotlin基础学习-第二篇 Kotlin进阶学习-第三篇 Kotlin进阶学习-第四篇 Kotlin进阶学习-第五篇 Kotlin由 JetBrains 公司开发设计,2011年公布第一版

    2024年01月16日
    浏览(32)
  • Kotlin学习 - 类和对象

    类定义 使用Java定义一个 Person 类,代码如下: 使用Kotlin来定义这个类 新建对象代码: 属性field、setter、getter 针对类中定义的每个属性,Kotlin都会产生一个 field ,一个 getter ,和一个 setter (只读属性没有 setter 方法), field 用来存储属性性的数据,无法直接定义 field 。Ko

    2024年02月10日
    浏览(23)
  • Kotlin学习篇——MutableStateFlow

    PS:知道kotlin的可以跳过这段,往下看 Kotlin是一种静态类型的编程语言,由JetBrains开发,可运行于Java虚拟机(JVM)上。它被设计为在Java开发环境中的替代语言,具有现代化的特性和语法。 Kotlin具有许多优点,包括更简洁的语法、空安全、函数式编程支持、扩展函数、类型推

    2024年02月06日
    浏览(19)
  • Kotlin学习记录

    除了java的 public , protected , default , private 外,又有独特的 internal , open 修饰符。 直译为内部的,访问范围是当前模块可见。使用示例: 默认情况下 class 和成员都是具备 final 修饰符的,即无法被继承和复写。 如果可以被继承或复写,需要添加 open 修饰。使用示例: 更多

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包