扩展
扩展函数
- 扩展可以在直接修改类定义的情况下增加类功能
- 扩展可以用于自定义类,比如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文件;文章来源:https://www.toymoban.com/news/detail-527501.html
/**
* 扩展函数需要在多个文件里面使用,可以将它定义在单独的文件,然后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模板网!