溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kotlin的::符號如何使用

發布時間:2022-01-24 15:36:28 來源:億速云 閱讀:200 作者:zzz 欄目:開發技術

這篇文章主要講解了“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的::符號如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女