這篇文章主要講解了“Kotlin的::符號如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Kotlin的::符號如何使用”吧!
這里我們舉個栗子,就看這個熟悉的sortBy排序函數,先定義People類:
//測試代碼 data class People(val name: String,val age: Int){ //自定義的排序條件 fun getMax() : Int{ return age * 10 + name.length } }
然后我們來進行排序:
val people = People("zyh",10) val people1 = People("zyh2",100) val peopleList = arrayListOf(people,people1) //給sortBy傳入lambda peopleList.sortBy { people -> people.getMax() }
這里我們給sortBy函數傳遞一個lambda,由于sortBy函數是內聯的,所以傳遞給它的lambda會被內聯,但是假如現在有個問題,就是這些lambda已經被定義成了函數變量,比如我定義了一個頂層函數:
//定義了一個頂層函數 fun getMaxSort(people: People): Int{ return (people.age) * 10 + people.name.length }
或者排序條件已經定義成了一個變量值:
//排序條件 val condition = { people: People -> people.getMax() }
那這時如果我想再進行排序必須要這么寫了:
//調用一遍函數 peopleList.sortBy { getMaxSort(it) } //傳遞參數 peopleList.sortBy(condition)
然后這里我們可以利用成員引用 :: 符號來優化一下:
//直接就會調用頂層函數getMaxSort peopleList.sortBy(::getMaxSort) //直接就會調用People類的getMax函數 peopleList.sortBy(People::getMax)
這里看起來就是語法糖,可以簡化代碼。
你有沒有想過這里是為什么,這里使用了 :: 符號其實就是把函數轉換成了一個值,首先我們使用
val condition = { people: People -> people.getMax() }
這種時,其實condition就是一個函數類型的變量,這個我們之前文章說過,Kotlin支持完整的函數類型,而使用高階函數可以用lambda,但是getMaxSort()函數它就是一個函數了,它不是一個值,除非你再外面給它包裹一層構成lambda,所以這里調用condition傳遞進的是sortBy()中,而getMaxSort(it)是以lambda的形式又包裹了一層。
但是使用 :: 符號后,也就是把函數轉換成了一個值,比如 People::getMax 這就是一個值,它代表的就是People內的getMax函數。
而 ::getMaxSort 也是一個值,它表示getMaxSort函數。
前面2個例子其實也就表明了這種成員引用的使用范圍,一個是類的函數或者屬性,還有就是頂層函數,它沒有類名,可以省略。
這里再額外說一個知識點,前面說成員引用都是 類名:屬性名 這種格式,比如 People::getMax ,但是它在后面KT版本變化后進行了優化,可以看下面代碼:
//定義一個people實例 val people = People("zyh",10) //利用成員引用,把函數轉換成值 val ageFun = People::age val age = ageFun(people) //直接在對象實例上使用 :: val ageValue = people::age
從上面我們發現,ageValue的值可以從實例上通過成員引用調用得到,不過這里區別就大了,ageFun是一個函數類型,而ageValue則是一個int值。
感謝各位的閱讀,以上就是“Kotlin的::符號如何使用”的內容了,經過本文的學習后,相信大家對Kotlin的::符號如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。