kotlin学习笔记——内联函数
生活随笔
收集整理的這篇文章主要介紹了
kotlin学习笔记——内联函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在Kotlin中,使用inline修飾符標記內聯函數。
與普通函數不同,內聯函數在編譯時被替換掉,不是真正的函數調用。
如kotlin提供的with函數,如下:
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block() 接收一個對象receiver和一個函數block,函數體是用這個對象來執行函數receiver.block(),相當于對receiver擴展了block函數。
注意:“T.() -> R”表示這個傳入的函數是對T的擴展函數,所以在函數體中才可以receiver.block()。如果改成“() -> R”則receiver.block()會報錯,直接使用block()才行。
通過內聯函數可以簡化代碼,如:
inline fun supportLollipop(code: () -> Unit){if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){code()}
} 這樣當我們想在高版本執行代碼時,直接使用這個函數即可,如:
supportLollipop{...
}
1、with函數
with函數接收一個對象和一個擴展函數,作用是在這個對象上擴展這個函數,這樣在函數中可以以this的形式使用該對象。在對一個對象做很多操作時,使用with可以簡化代碼,如: with(person1){nameView.text = nameageView.text = age.toString()detailView.text = "name:$name, age:$age"
} 就可以不用寫類似person1.name之類的代碼了。
2、let函數
let函數很簡單,接收一個函數作為參數,將函數的返回值作為let函數的返回值。在處理可null對象是很有用。
inline fun <T, R> T.let(f: (T) -> R): R = f(this) 使用了兩個泛型,T是調用者類型,同時也是接收函數所接收的參數類型;R是返回值類型。
如何使用呢,假設有這樣的代碼:
val obj = if(item != null) manager.transfor(item) else null 使用let函數就可以簡化為
val obj = item?.let( manager.transfor(it) ) 因為有"?."操作符,只有當item不為null的時候才會執行代碼,所以為null的時候直接返回null給obj。(注意執行transfor時item已經是非null了,所以transfor可以接受非null參數)
3、apply函數
apply函數與with函數很相似,不同處是apply函數會在執行接收的函數后返回this。
inline fun <T> T.apply(f: T.() -> Unit): T { f(); return this } apply函數可以使我們避免創建builder,如:
val textView = TextView(context).apply{text = "hello"hint = "hint"textColor = android.R.color.white
} 當然我們也可以使用with,如:
val textView = with( TextView(context) ){...this
}
最后要手動返回this,所以這種情況下使用apply會更加方便一些。(注意with是沒有調用者的)
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的kotlin学习笔记——内联函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kotlin学习笔记——lambda表达
- 下一篇: kotlin学习笔记——Kotlin A