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!

推薦閱讀: