在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沒有限定符,那麼它指向包含目前代碼的最内層範圍。