Kotlin入門筆記七:Lambda之引用

kotlin

在筆記六中我們熟悉了Koltin中的Lambda表達(dá)式的語法和簡化,Lambda在我們?nèi)粘i_發(fā)中是很常見的,常見到你處處能用到,譬如:

fla_android_top.setOnClickListener {
    ListUtil.moveToPosition(linearLayoutManager!!, rl_android, 0)
}

View的點(diǎn)擊事件,就是一個典型的Lambda表達(dá)式,看到這個再想想我們平時用Java寫一個點(diǎn)擊事件的繁瑣,注意這里說的是Java8以下的版本哦,因為在Java8中也引入了Lambda表達(dá)式,所以想自己的代碼變得簡潔易讀,大家還是要注重Lambda的學(xué)習(xí)。


下面給大家?guī)淼氖荎otlin中的引用,在Kotlin中引用有很多,比如:成員應(yīng)用、方法引用、屬性引用,我們來一一介紹,都是和Lambda有關(guān)聯(lián)的。

成員引用:

val getAge = Person::age

這種表達(dá)式就稱之為成員引用,它提供了一種很簡明的語法,來創(chuàng)建一個調(diào)用單個方法或者訪問單個屬性的函數(shù)值。雙冒號把類名與引用的成員(一個方法或者一個屬性)名稱隔開。

再來看看和Lambda表達(dá)式寫法有啥區(qū)別:

    val list = listOf(Person(22, "tao"), Person(23, "Kotlin"), Person(11, "Java"))
    println(list.maxBy { it.age })
    println(list.maxBy(Person::age))

看到這兩種寫法是不是有小伙伴要問了,這不Lambda表達(dá)式更簡潔么?沒錯,在沒有嵌套Lambda的時候當(dāng)然不存在優(yōu)勢之分了,別著急,接下來我們慢慢看、慢慢學(xué)。

構(gòu)造方法引用:

上代碼:

    // 構(gòu)造方法引用:
    val getPerson = ::Person
    println(getPerson(11, "taonce"))

我們用一個變量值將創(chuàng)建Person實(shí)例的動作保存了,后面只需調(diào)用這個變量就ok了。

擴(kuò)展函數(shù)的引用:

上代碼:

data class Person(val age: Int, val name: String)
// 這是Person的一個擴(kuò)展函數(shù),判斷是否成年
fun Person.isAdult() = age >= 18
// 擴(kuò)展函數(shù)引用:
val adult = Person::isAdult
val child = getPerson(11, "taonce")
println(adult(child))

// 輸出:false

上面介紹了幾種引用之后,現(xiàn)在到了該大顯身手的時候了,在筆記六中我提過,如果存在嵌套的Lambda,即使只有Lambda只有一個參數(shù),最好也不要使用it,這樣很容易弄混這個it引用的是哪個值,推薦在嵌套的Lambda時,顯示的聲明每個Lambda的參數(shù)。這是在筆記六中原話,現(xiàn)在我么你想要實(shí)現(xiàn)一個功能,輸出年齡最大的人的信息,你試試用兩個it來表達(dá),編譯器變回發(fā)出警告,這時候我們就可以用成員引用來輕松的解決了:

    // 輸出年齡超過30歲的人的姓名
    val people = listOf(Person(22, "A"),
            Person(32, "B"),
            Person(11, "C"),
            Person(40, "D"))
    println(people.filter { it.age == people.maxBy { it.age }!!.age })
    println(people.filter { it.age == people.maxBy(Person::age)!!.age })

我寫了兩種,第一種是Lambda,第二種是引用,但是第一種編譯器會發(fā)出警報,說你的it指向不明,經(jīng)過編譯器的改正寫法為:
println(people.filter { it -> it.age == people.maxBy { it.age }!!.age }),反而變得復(fù)雜,所以這時候的引用就發(fā)揮了很大的作用。

引用在越復(fù)雜的代碼中起到的作用越來,希望在自己的練手demo中好好領(lǐng)悟這一點(diǎn)。


總結(jié):

這份筆記到此就結(jié)束啦,主要就是介紹引用的一些寫法和怎么利用引用結(jié)合Lambda寫出更高效、易懂的代碼。下份筆記將記錄利用Lambda優(yōu)化代碼的操作。


寫在最后

每個人不是天生就強(qiáng)大,你若不努力,如何證明自己,加油!

Thank You!

--Taonce

如果你覺得這篇文章對你有所幫助,那么就動動小手指,長按下方的二維碼,關(guān)注一波吧~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,276評論 9 118
  • 寫在開頭:本人打算開始寫一個Kotlin系列的教程,一是使自己記憶和理解的更加深刻,二是可以分享給同樣想學(xué)習(xí)Kot...
    胡奚冰閱讀 1,293評論 0 6
  • lambda即lambda表達(dá)式,簡稱lambda。本質(zhì)上是可以傳遞給其它函數(shù)的一小段代碼。有了lambda,可以...
    程自舟閱讀 16,119評論 1 26
  • 遙遠(yuǎn)的傳說 迷失在蒼茫的林海 婆娑的樹影 搖曳著這片土地神秘的色彩 啊...
    守候一抹溫情閱讀 515評論 1 1
  • 在知乎上曾看到這樣一個問題——如何成為一個故事的主角?我正巧就認(rèn)識這樣一個人,他是我從小的偶像,也是一個當(dāng)之無愧地...
    雨幕流蘇閱讀 356評論 0 0