扩展

扩展函数

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

如何定义扩展函数

和定义一般函数差不多需要指定接受功能扩展的接受者类型

/**

* 定义扩展函数和定义一般函数差不多,有一点不同

* 你还需要指定接受功能扩展的接受者类型

*/

//定义下面的扩展函数,这里不单指定了方法名,还指定了接受者类型是String

fun String.addExt(amount: Int = 1) = this + "!".repeat(amount);

fun main() {

}

泛型扩展函数

新的泛型扩展函数不仅可以支持任何类型的接受者,还保留了接受者的类型信息

//定义泛型扩展函数

fun 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 Iterable.randomTake(): T = this.shuffled().first();

在另一个kotlin文件中使用;

//这里使用的话就用import引入

import ohos.samples.kotlin18.randomTake

fun main() {

val list = listOf("Jason", "Jack", "Tom")

val set = listOf("love", "hate", "like")

println(list.randomTake());

}

重命名扩展

//重命名扩展

//有时候你想使用一个类的扩展,但它的名字不如你的意,可以使用as重命名扩展

import ohos.samples.kotlin18.randomTake as randomizer

fun main() {

val list = listOf("Jason", "Jack", "Tom")

val set = listOf("love", "hate", "like")

println(list.randomizer());

}

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。