Kotlin实战指南十:let、apply、with、run
轉(zhuǎn)載請標明出處:https://blog.csdn.net/zhaoyanjun6/article/details//94402604
本文出自【趙彥軍的博客】
文章目錄
- let
- 示例1:基礎用法
- 示例2:返回值
- 示例3:android實戰(zhàn)
- apply
- 示例
- with
- 示例1:返回值為一個字符串
- 示例2:返回值為 this
- run
- 示例
let
let可以配合可空性 “?”來使用,如果data=null 則不執(zhí)行l(wèi)et內(nèi)部代碼,如果有返回值則直接返回null
在let中,用it表示引用對象,并可調(diào)用其方法,it不可省略。
返回值是語句塊的最后一行的返回類型,若最后一行語句無返回值,則整個let語句塊也無返回值
示例1:基礎用法
class MainActivity : AppCompatActivity() {var list: ArrayList<Int>? = ArrayList()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)list?.let {it.add(1)it.add(2)it.add(3)}Log.e("zhaoyanjun:", "$list")} }輸出結(jié)果:
[1, 2, 3]示例2:返回值
class MainActivity : AppCompatActivity() {var list: ArrayList<Int>? = ArrayList()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//let的返回值為 let 語句塊的最后一行var result = list?.let {it.add(1)it.add(2)it.add(3)"ok"}Log.e("zhaoyanjun:", "$list $result" )} }輸出結(jié)果:
E/zhaoyanjun:: [1, 2, 3] ok示例3:android實戰(zhàn)
class MainActivity : AppCompatActivity() {private var tv: TextView? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)tv = findViewById(R.id.tv)tv?.let {it.text = "zhaoyanjun"it.textSize = 20fit.setOnClickListener {Toast.makeText(it.context, "click", Toast.LENGTH_SHORT).show()}}} }apply
apply使用this指代T,函數(shù)值返回值是Unit。但apply通過return this主動返回T的實例。
@kotlin.internal.InlineOnly public inline fun <T> T.apply(block: T.() -> Unit): T {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}block()return this }示例
創(chuàng)建LinearLayout并利用apply設置初始化參數(shù),最后返回初始化完畢的LinearLayout實例。
val linearLayout = LinearLayout(itemView.context).apply {orientation = LinearLayout.VERTICALlayoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT) }上面的代碼等價于:
val linearLayout = LinearLayout(itemView.context) linearLayout.orientation = LinearLayout.VERTICAL linearLayout.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT)如果構(gòu)造過程中需要初始化的變量較多,使用apply形成的代碼塊會非常直觀。
with
接收一個receiver和一個函數(shù)式,通過this調(diào)用receiver,返回值根據(jù)函數(shù)式最后一個返回值為準。
一般會在傳入receiver的時候就地創(chuàng)建實例,不然使用apply來替代with會是更好的選擇。
可為null時別和with搭檔
@kotlin.internal.InlineOnly public inline fun <T, R> with(receiver: T, block: T.() -> R): R {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}return receiver.block() }示例1:返回值為一個字符串
with(ArrayList<String>()) {add("a")add("b")"ok"}示例2:返回值為 this
var list = with(ArrayList<String>()) {add("a")add("b")this}list.add("c")run
執(zhí)行傳入的函數(shù)式,并返回函數(shù)的執(zhí)行結(jié)果。run的主要目的是強調(diào)需要執(zhí)行的函數(shù)。
@kotlin.internal.InlineOnly public inline fun <R> run(block: () -> R): R {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}return block() }@kotlin.internal.InlineOnly public inline fun <T, R> T.run(block: T.() -> R): R {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}return block() }示例
從intent取EXTRA_URL的值,不為非空且內(nèi)容不為空,賦值給url。否則彈出提示并關閉頁面。
// Init url:String url = intent.getStringExtra(EXTRA_URL)?.takeIf { it.isNotEmpty() } ?: run {toast("不能瀏覽一個空鏈接哦")activity.finish() }個人微信號:zhaoyanjun125 , 歡迎關注
[外鏈圖片轉(zhuǎn)存失敗(img-PqVPXCqe-1562039687164)(http://res.qiniu.zhaoaiqiao.com/weixin200.jpg)]
總結(jié)
以上是生活随笔為你收集整理的Kotlin实战指南十:let、apply、with、run的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kotlin实战指南九:延迟初始化
- 下一篇: Kotlin实战指南十一:扩展函数