亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Kotlin中關于內聯(lián)函數的一些理解分享

 更新時間:2018年07月09日 08:57:04   作者:淚已無痕  
這篇文章主要給大家介紹了關于Kotlin中內聯(lián)函數的一些理解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

看了很多博客,才明白了內聯(lián)的含義,其實最根本的就是將寫在別處的代碼拷貝到你現在執(zhí)行的方法中,相當于在一個方法中執(zhí)行,java的方法執(zhí)行是需要壓棧出棧的對吧,如果是兩三個方法那就是兩三次的壓棧出棧,為了節(jié)省這個操作,提高一定的效率,kotlin就出了這么個函數。但又想想,如果是個超級大的函數,考來考去的也是很麻煩啊,所以這東西需要自己權衡吧,遵守單一職責,降低代碼圈發(fā)雜度才是根本。

內聯(lián)函數的理解

inline函數(內聯(lián)函數)從概念上講是編譯器使用函數實現的真實代碼來替換每一次的函數調用,帶來的最直接的好處就是節(jié)省了函數調用的開銷,而缺點就是增加了所生成字節(jié)碼的尺寸?;诖?,在代碼量不是很大的情況下,我們是否有必要將所有的函數定義為內聯(lián)?讓我們分兩種情況進行說明:

  1. 將普通函數定義為內聯(lián):眾所周知,JVM內部已經實現了內聯(lián)優(yōu)化,它會在任何可以通過內聯(lián)來提升性能的地方將函數調用內聯(lián)化,并且相對于手動將普通函數定義為內聯(lián),通過JVM內聯(lián)優(yōu)化所生成的字節(jié)碼,每個函數的實現只會出現一次,這樣在保證減少運行時開銷的同時,也沒有增加字節(jié)碼的尺寸;所以我們可以得出結論,對于普通函數,我們沒有必要將其聲明為內聯(lián)函數,而是交給JVM自行優(yōu)化。
  2. 將帶有l(wèi)ambda參數的函數定義為內聯(lián):是的,這種情況下確實可以提高性能;但在使用的過程中,我們會發(fā)現它是有諸多限制的,讓我們從下面的例子開始展開說明:
inline fun doSomething(action: () -> Unit) {
 println("Before doSomething...")
 action()
 println("After doSomething...")
}

假如我們這樣調用doSomething:

fun main(args: Array<String>) {
 doSomething {
  pringln("Hello World")
 }
} 

上面的調用會被編譯成:

fun main(args: Array<String>) {
 println("Before doSomething...")
 println("Hello World")
 println("After doSomething...")
}

從上面編譯的結果可以看出,無論doSomething函數還是action參數都被內聯(lián)了,很棒,那讓我們換一種調用方式:

fun main(args: Array<String>) {
 val action:() -> Unit = { println("Hello World") }
 doSomething(action)
}

上面的調用會被編譯成:

fun main(args: Array<String>) {
 println("Before doSomething...")
 action()
 println("After doSomething...")
}

doSomething函數被內聯(lián),而action參數沒有被內聯(lián),這是因為以函數型變量的形式傳遞給doSomething的lambda在函數的調用點是不可用的,只有等到doSomething被內聯(lián)后,該lambda才可以正常使用。

通過上面的例子,我們對lambda表達式何時被內聯(lián)做一下簡單的總結:

  • 當lambda表達式以參數的形式直接傳遞給內聯(lián)函數,那么lambda表達式的代碼會被直接替換到最終生成的代碼中。
  • 當lambda表達式在某個地方被保存起來,然后以變量形式傳遞給內聯(lián)函數,那么此時的lambda表達式的代碼將不會被內聯(lián)。

上面對lambda的內聯(lián)時機進行了討論,消化片刻后讓我們再看最后一個例子:

inline fun doSomething(action: () -> Unit, secretAction: () -> Unit) {
 action()
 doSomethingSecret(secretAction)
}

fun doSomethingSecret(secretAction: () -> Unit) {
}

上面的例子是否有問題?是的,編譯器會拋出“Illegal usage of inline-parameter”的錯誤,這是因為Kotlin規(guī)定內聯(lián)函數中的lambda參數只能被直接調用或者傳遞給另外一個內聯(lián)函數,除此之外不能作為他用;那我們如果確實想要將某一個lambda傳遞給一個非內聯(lián)函數怎么辦?我們只需將上述代碼這樣改造即可:

inline fun doSomething(action: () -> Unit, noinline secretAction: () -> Unit) {
 action()
 doSomethingSecret(secretAction)
}

fun doSomethingSecret(secretAction: () -> Unit) {
}

很簡單,在不需要內聯(lián)的lambda參數前加上noinline修飾符就可以了。

以上便是我對內聯(lián)函數的全部理解,通過掌握該特性的運行機制,相信大家可以做到在正確的時機使用該特性,而非濫用或因恐懼棄而不用。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • Android 實現釘釘自動打卡功能

    Android 實現釘釘自動打卡功能

    這篇文章主要介紹了Android 實現釘釘自動打卡功能的步驟,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下
    2021-03-03
  • Android AAPT(Android Asset Packaging Tool)詳解

    Android AAPT(Android Asset Packaging Too

    AAPT - Android Asset Packaging Tool作用AAPT基本命令AAPT編譯資源源碼解析AAPT打包和系統(tǒng)不一致的資源
    2024-04-04
  • Android自定義view實現多色進度條GradientProgressView的繪制

    Android自定義view實現多色進度條GradientProgressView的繪制

    我們常使用shape實現漸變色,但是shape的極限卻只有三色,如果有超過三種顏色的View的要求,那么我們就不得不去自定義View來實現這個需求,所以下面我們就來看看如何自定義view實現多色進度條的繪制吧
    2023-08-08
  • Android Fresco圖片加載優(yōu)化的方案

    Android Fresco圖片加載優(yōu)化的方案

    這篇文章主要介紹了Android Fresco圖片加載優(yōu)化的方案,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下
    2021-03-03
  • 如何通過Android Logcat插件分析firebase崩潰問題

    如何通過Android Logcat插件分析firebase崩潰問題

    android crash Crash(應用崩潰)是由于代碼異常而導致App非正常退出,導致應用程序無法繼續(xù)使用,所有工作都停止的現象,本文重點介紹如何通過Android Logcat插件分析firebase崩潰問題,感興趣的朋友一起看看吧
    2024-01-01
  • Android raw 目錄下視頻的縮略圖的獲取

    Android raw 目錄下視頻的縮略圖的獲取

    這篇文章主要介紹了 Android raw 目錄下視頻的縮略圖的獲取的相關資料,需要的朋友可以參考下
    2017-07-07
  • Android 對話框(Dialog)大全詳解及示例代碼

    Android 對話框(Dialog)大全詳解及示例代碼

    本文主要介紹Android 對話框的知識,這里整理了詳細資料及實現示例代碼及實現效果圖,有興趣的小伙伴可以參考下
    2016-09-09
  • Kotlin?協(xié)程思維模型的引入使用建立

    Kotlin?協(xié)程思維模型的引入使用建立

    這篇文章主要為大家介紹了Kotlin?協(xié)程思維模型的引入使用及建立詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • Flutter實現局部刷新

    Flutter實現局部刷新

    這篇文章主要為大家詳細介紹了Flutter實現局部刷新,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Android實現頂部懸浮效果

    Android實現頂部懸浮效果

    這篇文章主要為大家詳細介紹了Android實現頂部懸浮效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論