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ù)轉(zhuǎn)換成了一個值,首先我們使用
val condition = { people: People -> people.getMax() }這種時,其實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ù),它沒有類名,可以省略。
綁定引用
這里再額外說一個知識點,前面說成員引用都是 類名:屬性名 這種格式,比如 People::getMax ,但是它在后面KT版本變化后進(jìn)行了優(yōu)化,可以看下面代碼:
//定義一個people實例
val people = People("zyh",10)
//利用成員引用,把函數(shù)轉(zhuǎn)換成值
val ageFun = People::age
val age = ageFun(people)
//直接在對象實例上使用 ::
val ageValue = people::age從上面我們發(fā)現(xiàn),ageValue的值可以從實例上通過成員引用調(diào)用得到,不過這里區(qū)別就大了,ageFun是一個函數(shù)類型,而ageValue則是一個int值。
總結(jié)
總結(jié)一下,其實成員引用 :: 很簡單,它就是把函數(shù)給轉(zhuǎn)成了值,而這個值可以看成是函數(shù)類型,這樣說就十分好理解了。
到此這篇關(guān)于Kotlin的::符號怎么用的文章就介紹到這了,更多相關(guān)Kotlin ::符號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 采用AOP方式封裝6.0權(quán)限管理的方法
這篇文章主要介紹了Android 采用AOP方式封裝6.0權(quán)限管理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
Android實現(xiàn)Ant Design 自定義表單組件
Ant Design 組件提供了Input,InputNumber,Radio,Select,uplod等表單組件,下面通過本文給大家詳細(xì)介紹Android實現(xiàn)Ant Design 自定義表單組件,需要的的朋友參考下吧2017-06-06
Android RecyclerView自定義上拉和下拉刷新效果
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView自定義上拉和下拉刷新效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02
Android如何獲取QQ與微信的聊天記錄并保存到數(shù)據(jù)庫詳解
這篇文章主要給大家介紹了關(guān)于Android如何獲取QQ與微信的聊天記錄并保存到數(shù)據(jù)庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2018-04-04

