Kotlin let、with、run、apply、also函数的使用
let,with,run,apply,also 是內聯擴展函數
下面是自己使用的心的如果有錯的地方希望給予指正謝謝
這幾個主要用來簡化操作,使得代碼可讀性提高 ,下面列舉項目中使用效果
1 let?
?先不啰嗦了 直接代碼吧 ,
不是let? 的代碼
val list = ArrayList<String>()list.add("A")list.add("B")list.add("C")for (i in list.indices) {println(list[i])}
使用let 之后如下
val list = ArrayList<String>()list.let {it.add("A")it.add("B")it.add("C")}for (i in list.indices) {println(list[i])Log.e("==============hly=======",list[i])}
他們對比發現list 沒有反復的使用, 不過卻有一個it?
自己在項目中測試let也使用了
沒有使用let 如下?
這個是刷新的地方, 估計很多人都在使用,是不是刷新的id要寫2次
class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener {override fun onRefresh(refreshLayout: RefreshLayout) {}override fun onLoadMore(refreshLayout: RefreshLayout) {}@SuppressLint("LongLogTag")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)smart.setOnRefreshListener { this@MainActivity }smart.setOnLoadMoreListener { this@MainActivity }
使用let如下
class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener {override fun onRefresh(refreshLayout: RefreshLayout) {}override fun onLoadMore(refreshLayout: RefreshLayout) {}@SuppressLint("LongLogTag")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)smart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}
剛才是自己點擊let看看源碼
/*** Calls the specified function [block] with `this` value as its argument and returns its result.*/
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}return block(this)
}
百度翻譯下 let 注釋?
以' this '值作為參數調用指定的函數[block]并返回其結果。
?
2 with
還是用剛才的list代碼 用with 試試
val list = ArrayList<String>()with(list){add("A")add("B")add("C")}for (i in list.indices) {println(list[i])Log.e("==============hly=======",list[i])}
這個寫法和剛才的有很大差別是不是
在使用with 實現刷新
class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener {override fun onRefresh(refreshLayout: RefreshLayout) {}override fun onLoadMore(refreshLayout: RefreshLayout) {}@SuppressLint("LongLogTag")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//原始的smart.setOnRefreshListener { this@MainActivity }smart.setOnLoadMoreListener { this@MainActivity }//letsmart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}//withwith(smart) {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}
?
with 的源碼
?
/*** Calls the specified function [block] with the given [receiver] as its receiver and returns its result.*/
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}return receiver.block()
}
翻譯下with的注釋:
使用給定的[receiver]調用指定的函數[block]并返回其結果。
?
3 run?
使用剛才的list 如下
val list = ArrayList<String>()list.run {add("A")add("B")add("C")}for (i in list.indices) {println(list[i])Log.e("==============hly=======", list[i])}
在寫一些刷新看看
class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener {override fun onRefresh(refreshLayout: RefreshLayout) {}override fun onLoadMore(refreshLayout: RefreshLayout) {}@SuppressLint("LongLogTag")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//原始的smart.setOnRefreshListener { this@MainActivity }smart.setOnLoadMoreListener { this@MainActivity }//letsmart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}//withwith(smart) {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//runsmart.run {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}
?
這些我沒把let ,with 去掉方便大家對比查看,實現的效果是一樣的
?
run的源碼
/*** Calls the specified function [block] with `this` value as its receiver and returns its result.*/
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}return block()
}
翻譯注釋
調用指定的函數[block],并以' this '值作為其接收方,返回其結果。
4 apply
剛開的list 使用apply 如下
val list = ArrayList<String>()list.apply {add("A")add("B")add("C")}for (i in list.indices) {println(list[i])Log.e("==============hly=======", list[i])}
apply 實現的刷新 如下
class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener {override fun onRefresh(refreshLayout: RefreshLayout) {}override fun onLoadMore(refreshLayout: RefreshLayout) {}@SuppressLint("LongLogTag")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//原始的smart.setOnRefreshListener { this@MainActivity }smart.setOnLoadMoreListener { this@MainActivity }//letsmart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}//withwith(smart) {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//runsmart.run {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//applysmart.apply{setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}
apply的源碼
/*** Calls the specified function [block] with `this` value as its receiver and returns `this` value.*/
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {contract {callsInPlace(block, InvocationKind.EXACTLY_ONCE)}block()return this
}
翻譯注釋
調用指定的函數[block],并將' this '值作為其接收器,返回' this '值。
5 also
使用剛才的list also 的使用如下
val list = ArrayList<String>()list.also {it.add("A")it.add("B")it.add("C")}for (i in list.indices) {println(list[i])Log.e("==============hly=======", list[i])}
?
also 的刷新如下
class MainActivity : AppCompatActivity(), OnRefreshListener, OnLoadMoreListener {override fun onRefresh(refreshLayout: RefreshLayout) {}override fun onLoadMore(refreshLayout: RefreshLayout) {}@SuppressLint("LongLogTag")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//原始的smart.setOnRefreshListener { this@MainActivity }smart.setOnLoadMoreListener { this@MainActivity }//letsmart.let {it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}//withwith(smart) {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//runsmart.run {setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//applysmart.apply{setOnRefreshListener { this@MainActivity }setOnLoadMoreListener { this@MainActivity }}//alsosmart.also{it.setOnRefreshListener { this@MainActivity }it.setOnLoadMoreListener { this@MainActivity }}
這個幾個寫法和對比都在這里, 我自己都一一測試過的,局可以實現 ,
以上就是他們的使用方法 , 有不明白的或者錯誤的希望指點一下,相互進步.....
?
總結
以上是生活随笔為你收集整理的Kotlin let、with、run、apply、also函数的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “翠黛不须留五马”下一句是什么
- 下一篇: Koltin 高阶函数