Kotlin的::符號怎么用
前言
在閱讀Kotlin的代碼時,經(jīng)常有看到 :: 這個符號,這個符號專業(yè)術(shù)語叫做成員引用,在代碼中使用可以簡化代碼,那到底怎么使用呢以及使用的范圍,這篇文章就來好好捋一下。
正文
這里雖然很熟悉,但是我們還是從簡單說起,需要了解為什么這樣設(shè)計。
傳遞函數(shù)優(yōu)化
這里我們舉個栗子,就看這個熟悉的sortBy排序函數(shù),先定義People類:
//測試代碼 data class People(val name: String,val age: Int){ ? ? //自定義的排序條件 ? ? fun getMax() : Int{ ? ? ? ? return age * 10 + name.length ? ? } }
然后我們來進(jìn)行排序:
val people = People("zyh",10) val people1 = People("zyh1",100) val peopleList = arrayListOf(people,people1) //給sortBy傳入lambda peopleList.sortBy { people -> people.getMax() }
這里我們給sortBy函數(shù)傳遞一個lambda,由于sortBy函數(shù)是內(nèi)聯(lián)的,所以傳遞給它的lambda會被內(nèi)聯(lián),但是假如現(xiàn)在有個問題,就是這些lambda已經(jīng)被定義成了函數(shù)變量,比如我定義了一個頂層函數(shù):
//定義了一個頂層函數(shù) fun getMaxSort(people: People): Int{ ? ? return (people.age) * 10 + people.name.length }
或者排序條件已經(jīng)定義成了一個變量值:
//排序條件 val condition = { people: People -> people.getMax() }
那這時如果我想再進(jìn)行排序必須要這么寫了:
//調(diào)用一遍函數(shù) peopleList.sortBy { getMaxSort(it) } //傳遞參數(shù) peopleList.sortBy(condition)
然后這里我們可以利用成員引用 :: 符號來優(yōu)化一下:
//直接就會調(diào)用頂層函數(shù)getMaxSort peopleList.sortBy(::getMaxSort) //直接就會調(diào)用People類的getMax函數(shù) peopleList.sortBy(People::getMax)
這里看起來就是語法糖,可以簡化代碼。
成員引用 ::
你有沒有想過這里是為什么,這里使用了 :: 符號其實(shí)就是把函數(shù)轉(zhuǎn)換成了一個值,首先我們使用
val condition = { people: People -> people.getMax() }
這種時,其實(shí)condition就是一個函數(shù)類型的變量,這個我們之前文章說過,Kotlin支持完整的函數(shù)類型,而使用高階函數(shù)可以用lambda,但是getMaxSort()函數(shù)它就是一個函數(shù)了,它不是一個值,除非你再外面給它包裹一層構(gòu)成lambda,所以這里調(diào)用condition傳遞進(jìn)的是sortBy()中,而getMaxSort(it)是以lambda的形式又包裹了一層。
但是使用 :: 符號后,也就是把函數(shù)轉(zhuǎn)換成了一個值,比如 People::getMax 這就是一個值,它代表的就是People內(nèi)的getMax函數(shù)。
而 ::getMaxSort 也是一個值,它表示getMaxSort函數(shù)。
使用范圍
前面2個例子其實(shí)也就表明了這種成員引用的使用范圍,一個是類的函數(shù)或者屬性,還有就是頂層函數(shù),它沒有類名,可以省略。
綁定引用
這里再額外說一個知識點(diǎn),前面說成員引用都是 類名:屬性名 這種格式,比如 People::getMax ,但是它在后面KT版本變化后進(jìn)行了優(yōu)化,可以看下面代碼:
//定義一個people實(shí)例 val people = People("zyh",10) //利用成員引用,把函數(shù)轉(zhuǎn)換成值 val ageFun = People::age val age = ageFun(people) //直接在對象實(shí)例上使用 :: val ageValue = people::age
從上面我們發(fā)現(xiàn),ageValue的值可以從實(shí)例上通過成員引用調(diào)用得到,不過這里區(qū)別就大了,ageFun是一個函數(shù)類型,而ageValue則是一個int值。
總結(jié)
總結(jié)一下,其實(shí)成員引用 :: 很簡單,它就是把函數(shù)給轉(zhuǎn)成了值,而這個值可以看成是函數(shù)類型,這樣說就十分好理解了。
到此這篇關(guān)于Kotlin的::符號怎么用的文章就介紹到這了,更多相關(guān)Kotlin ::符號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 監(jiān)聽手機(jī)GPS打開狀態(tài)實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 監(jiān)聽手機(jī)GPS打開狀態(tài)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05android12?SD如何動態(tài)申請讀寫權(quán)限
這篇文章主要給大家介紹了關(guān)于android12?SD如何動態(tài)申請讀寫權(quán)限的相關(guān)資料,從Android?6.0開始,權(quán)限不再是在manifest?件中粘貼?下即可,這時候權(quán)限也正式?進(jìn)?家的視野,需要的朋友可以參考下2023-07-07Android 自動補(bǔ)全提示輸入AutoCompleteTextView、 MultiAutoCompleteTextV
本文主要介紹了Android自動補(bǔ)全提示輸入AutoCompleteTextView、 MultiAutoCompleteTextView,具有一定的參考作用,下面跟著小編一起來看下吧2017-01-01解析android中的幫助、about、關(guān)于作者、HELP等提示頁面
本篇文章是對android中的幫助、about、關(guān)于作者、HELP等提示頁面進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Android ReboundScrollView仿IOS拖拽回彈效果
這篇文章主要為大家詳細(xì)介紹了Android ReboundScrollView仿IOS拖拽回彈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11Android中方法數(shù)超限問題與啟動優(yōu)化詳解
這篇文章主要給大家介紹了Android中方法數(shù)超限問題與啟動優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11Android Binder進(jìn)程間通信工具AIDL使用示例深入分析
Binder作為Android 眾多的IPC通訊手段之一,在Framework的數(shù)據(jù)傳輸中起到極為關(guān)鍵的作用。Binder機(jī)制可謂是Android 知識體系里的重中之重,作為偏底層的基礎(chǔ)組件,平時我們很少關(guān)注它,而它卻是無處不在,也是Android 面試易考察的點(diǎn)之一2022-11-11