hi各位亲,这一篇接上一篇《在飞Android Kotlin快速入门-apply{}、with{}篇3》,这篇主要说下let{}和run{}。
一:let{}
上面是let的源码,我们解读下方法体中的具体含义:
<T,R>:参数是泛型T,R
T.let(block:(T)->R):T.let意思是T中都会有let(),其中参数(block:(T)->R)是个函数类型,但是参数是调用者本身T
():R: let的返回值就是(block:(T)->R)这个lambda表达式的返回值,即为R。
之前章节提到过,lambda表达式的最后一行是返回值。{}
举个例子:
class testLet {
fun testLet() {
var list = mutableListOf<String>()
list.add("a")
var letResult = list.let {
//it代表的是list
"a"//letResult结果是String
1 //letResult结果是int
it//letResult结果是int结果是MutableList<String>
}
}
}
二:run{}
上面是run的源码,我们解读下方法体中的具体含义:
<T,R>:<T,R>:参数是泛型T,R
T.run(block:T.()->R):T.run()意思是T中有run函数扩展,其中参数(block:T.()->R)是函数类型,同时是T中的函数,R是返回的lambda表达式返回的结果。 转载请注明出处:https://blog.csdn.net/pangzaifei/article/details/85120874
():R :run()返回的结果是R,就是lambda表达式的结果
举个例子:
三:apply{}、with{}、let{}、run{}区别
先看下源码不同:
//apply
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
//with
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
//let
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
//run
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R = block()
区别点:
1.是否能单独使用?
apply{}、let{}、run{}都是需要T的扩展函数,不能单独使用。 with(){}不需要具体的扩展,可以单独使用。
2.是否需要多个参数
apply{}、let{}、run{}仅需要一个参数,而且还是函数参数lambda。with(){}需要两个参数,第一个是需要操作的T,第二个参数才是函数参数lambda,所以使用with的时候是 with +() +{}
3.返回结果类型不同https://blog.csdn.net/pangzaifei/article/details/85120874
apply{}:不管lambda返回结果类型是什么,最终的结果都是T的类型。
with(){}、let{}、run{}:返回结果类型是你lambda表达式的最后一行的类型。
4.是否可以用this
apply、run、with的lambda中可以使用this
let的lambda中不可以使用this
总结:
在Android开发中会经常使用到这四个函数,用他们的好处是可以保证代码的整洁性和逻辑性,同时每个函数会有不同的返回结果类型,可以在不同的场景选择不同的方法使用,比用java少写很多代码。
Ps:我是在飞~~,只有空闲时间才能更新博客,所以本系列偏快速入门,主要讲实战中经常用到内容,让你快速上手。所以文章尽量简短,敬请谅解,本系列文章默认阅读者已经熟悉java语言,希望我的博客对你有帮助!
===补充===
函数回调:在开发中经常会有异步操作的时候,比如网络请求,然后等待个几秒钟才会回来结果,之后使用这些数据。下面的例子就是用函数回调这种形式来解决异步的情况。
//函数回调begin
class Student {
fun goHome(block: (String) -> Unit) {//1.(String)是It的类型是String
Thread {
Log.e("fffpzf", "小明在路上....")
Thread.sleep(3000)//等待3秒后,学生到家了
var result = "经过3秒后,小明到家了...."
Log.e("fffpzf", result)
block.invoke("你需要的值,可以替代it")//上面1处声明了it的类型是String类型你希望的it的值或者类型,可以在此处修改。
}.start()
}
}
fun TestSutdent() {//此处是it
var student = Student()
student.goHome {
Log.e("fffpzf", "it:$it")
}
Log.e("fffpzf", "小明准备回家...")
}
===
小明准备回家...
小明在路上....
经过3秒后,小明到家了....
it:你需要的值,可以替代it
===
//函数回调end
有问题可联系q:1660380990邮箱[email protected]