1. 程式人生 > >Kotlin系列之Lambda表示式(3)

Kotlin系列之Lambda表示式(3)

今天一起來看看Kotlin中與Lambda相關的成員引用的內容。

定義

先說說什麼是成員引用,這裡的引用指的就是變數引用,就相當於Java中的引用概念。成員的概念這裡包含了成員變數和成員方法。這都是很官方的的說法。說白了,就是類裡面的變數和函式。所以我們這篇文章討論的就是如果一個成員函式或者變數已經被定義好了,我們如何使用Lambda表示式的語法,將它傳遞給另一個函式。

成員引用語法

我們的成員引用遵循下面的語法。

類名::成員變數名
類名::成員方法名

這裡通過::這個運算子負責將一個成員轉化成一個值。

一般類的成員引用

我們按照上面的語法來寫一個一般類的成員引用的例子

class Person{
    var age = 0

    fun doSomething(){
        println("do something")
    }
}

fun main(args: Array<String>) {
    val age = Person::age
    val doFun = Person::doSomething

    val p = Person()
    doFun(p)
    println(age(p))
}

上面的例子雖然有點繁瑣,但重點是為了演示這種用法。而且要注意一點,上面的成員方法的引用::

之後只有方法名,沒有()
當然成員引用也可以寫成下面這樣,這樣看起來更清晰好理解一點。

fun main(args: Array<String>) {
    val p = Person()
    val getAge = {p1: Person -> p1.age}
    getAge(p)
}
引用頂層函式

上面的引用都是要依託於類名,但是頂層函式是不依附於某個類的,那在Lambda表示式中該怎樣引用呢?

//頂層函式
fun  printInfo() = println("Info")

fun main(args: Array<String>) {
    val
printFun = ::printInfo }

可以看到引用方式是直接省略了類名,通過::方法名就可以引用了。

引用建構函式

下面在說說Lambda中如何引用建構函式,我們知道我們呼叫建構函式就建立了一個物件,那如果我把建構函式的引用賦值給一個變數,就可以對建構函式進行儲存和傳遞,然後在需要建立物件的時候再去建立。

//資料類
data class User(val name: String, val age: Int)
fun main(args: Array<String>) {
    val createUser = ::User
    val user = createUser("cmq", 12)
}

它的使用方式為::類名,跟頂層函式的應用有點像,看上面的例子就好像給建構函式起了個別名,但它卻是可以被傳遞的。

引用擴充套件函式

我們在前面還說過擴充套件函式,那麼在Lambda中如何引用擴充套件函式呢。其實擴充套件函式可以看作是被擴充套件的類的成員函式,所以引用方式和一般類的成員引用是一樣的。

fun User.isOld() = age > 60

fun main(args: Array<String>) {
  val siOldFun = User::isOld
}

寫在最後

今天的內容就結束了,總結為一句話就是我們知道了如何將成員函式和屬性變成可以傳遞的引數,上面的內容基本覆蓋了常用的場景,又一次看到了Kotlin的簡潔。