学习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月06日
    浏览(33)
  • kotlin的扩展函数“let、run、also、apply”的作用和区别

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

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

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

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

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

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

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

    2024年02月11日
    浏览(42)
  • Kotlin学习 - 类和对象

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

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

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

    2024年02月01日
    浏览(45)
  • 学习Kotlin~函数式编程

    高阶函数:以函数为参数或返回函数 函数式编程范式主要依赖于高阶函数返回的数据,这些高阶函数专用于处理各种集合 这些高阶函数可方便的联合多个同类函数构建链式操作以创建复杂的计算行为 函数类别 一个函数式应用通常由三大类构成:变换transform、过滤filter、合并

    2024年02月12日
    浏览(43)
  • kotlin学习和常用知识

    Kotlin 是一种由 JetBrains 公司开发的静态类型编程语言,旨在为 Java 开发者提供一种更加安全、简洁、易于使用的编程语言。Kotlin 可以编译成 Java 字节码,因此可以在 Java 虚拟机(JVM)上运行。下面是关于 Kotlin 的详细解释、发展历史、语法学习和代码解读。 基本概念 Kotlin 是

    2024年02月15日
    浏览(44)
  • Kotlin学习之路(六):继承

    Kotlin的继承和Java的继承一样都是单继承,区别在于Kotlin用 : 来代替了 extends Kotlin用 : 表示继承,Java用 exteds 表示继承。 上面是最简单的Kotlin继承的例子。这里还需要注意的是在Kotlin中类默认都是final的(代表该类不让继承),需要在 class 前面加上 open ,表示该类可以被其

    2023年04月19日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包