天天看點

Kotlin學習(6)擴充函數與屬性

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