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("zyh1",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 ::符號內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Kotlin與Java的區別詳解
- C# 中的List.Sort()–集合排序方法全面解析
- 秒懂Kotlin之Java工程師快速掌握Kotlin的技巧
- C# Lambda表達式及Lambda表達式樹的創建過程
- Kotlin編程基礎語法編碼規范