在Java中,我们经常使用到诸如StringUtil、DateUtil等工具类,代码写起来比较冗长。
比如我们要写一个工具类,获取一个字符串的第一个字母和最后一个字母,我们要先写一个工具类,然后定义好这两个方法。因为String类是不能自己添加自定义方法的。
在Kotlin就不一样了,天然的装饰模式,使得代码更加简洁明了。
1. 扩展函数
1.1 给String类扩展两个函数
fun String.firstChar(): String {
if (this.isEmpty()) return ""
return this[0].toString()
}
fun String.lastChar(): String {
if (this.isEmpty()) return ""
return this[this.length - 1].toString()
}
//调用:
println("abc".firstChar()) //a
println("abc".lastChar()) //c
//如果在其它package路径下面,则需要调用import导入扩展函数
import com.rikka.kotlin.firstChar
import com.rikka.kotlin.lastChar
1.2 给List扩展一个过滤函数
如果我们在koltin中自定义一个过滤函数,应该是这样写的:
fun <T> List<T>.filter(predicate: (T) -> Boolean): MutableList<T> {
val result = ArrayList<T>()
this.forEach {
if (predicate(it)) {
result.add(it)
}
}
return result
}
//调用
val result = list.filter{
it % 2 == 1
}
println(result)
使用
fun <类型参数> 目标类型.扩展函数名(函数入参): 函数返回类型
2. 扩展属性
除了扩展一个类的函数,还可以扩展类属性。
例如,我们给MutableList扩展两个属性: firstElement和lastElement,代码如下:
private var <T> MutableList<T>.firstElement: T
get() {
return this[0]
}
set(value) {
this[0] = value
}
var <T> MutableList<T>.lastElement: T
get() {
return this[this.size - 1]
}
set(vale) {
this[this.size - 1] = vale
}
//使用:
println(list.firstElement)
println(list.lastElement)
list.firstElement = x
list.lastElement =
语法说明如下:
var <类型参数> 目标类型.扩展函数名:扩展函数的类型
get(){
//getter
}
set()}{
//setter
}
3. 扩展中的关键字
this.forEach{
if(predicate(it)){
result.add(it)
}
}
- 在类的成员函数中,this指向这个类的当前对象实例
- 在扩展函数中,this代表调用函数时在点号左侧传递的接受者参数
- 如果this没有限定符,那么它指向包含当前代码的最内层范围。