- Kotlin入門筆記一:方法、變量、類
- Kotlin入門筆記二:when、for、in
- Kotlin入門筆記三:可空類型
- Kotlin入門筆記四:集合
- Kotlin入門筆記五:可見修飾符
- Kotlin入門筆記六:Lambda語法
- Kotlin入門筆記七:Lambda之引用
- Kotlin入門筆記八:Lambda和序列
在筆記六中我們熟悉了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)注一波吧~~