【Kotlin】let,also,run,apply与with的使用与区别

以下例子我们将前置代码的返回值称为 T,花括号部分称为 block,以弹出桌面程序选择框为例:
var intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_HOME)
intent.setClassName("android", "com.android.internal.app.ResolverActivity")
startActivity(intent)

总结

  • let 与 also 将 T 作为 it 传入 block,区别在于返回结果分别为 block 最后一行结果与 T本身
  • run 与 apply 将 T 作为 this 传入 block,区别在于返回结果分别为 block 最后一行结果与 T本身
  • with 也是将 T 作为 this 传入 block 并返回 block 最后一行结果,区别在于写法是 with(T)
    在这里插入图片描述

1、let – block: (T) -> R

  • Calls the specified function [block] with ‘this’ value as its argument and returns its result.
  • 百度翻译:用 this 值作为 参数 调用指定的函数 [block],并返回结果。
  • 个人理解:将 T 作为 it 传入 block 并返回 block 最后一行结果(T 为 intent,block 为 let 后的 {} 及内容)
var intent = Intent(Intent.ACTION_MAIN)
intent.let {//it:Intent
    it.addCategory(Intent.CATEGORY_HOME)
    it.setClassName("android", "com.android.internal.app.ResolverActivity")
    startActivity(it)//这里无返回值,所以整体let也是无返回值的
}.let{//it:Unit
}

2、also – block: (T) -> Unit

  • Calls the specified function [block] with ‘this’ value as its argument and returns this value.
  • 百度翻译:以 this 值作为 参数 调用指定的函数 [block],并返回 this 值。
  • 个人理解:将 T 作为 it 传入 block 并返回 T
intent.also {//it:Intent
    it.addCategory(Intent.CATEGORY_HOME)
    it.setClassName("android", "com.android.internal.app.ResolverActivity")
    startActivity(it)
}.let{//it:Intent
}

3、run – block: T.() -> R

  • Calls the specified function [block] with this value as its receiver and returns its result.
  • 百度翻译:以 this 值作为其 接收器 调用指定的函数 [block],并返回其结果。
  • 个人理解:将 T 作为 this 传入 block 并返回 block 最后一行结果,this 可以省略
intent.run {//this:Intent
    addCategory(Intent.CATEGORY_HOME)
    setClassName("android", "com.android.internal.app.ResolverActivity")
    startActivity(this)
}.let{//it:Unit
}

4、apply – block: T.() -> Unit

  • Calls the specified function [block] with this value as its receiver and returns this value.
  • 百度翻译:以 this 值作为其 接收器 调用指定的函数 [block],并返回 this 值。
  • 个人理解:将 T 作为 this 传入 block 并返回 T
intent.apply {//this:Intent
	addCategory(Intent.CATEGORY_HOME)
    setClassName("android", "com.android.internal.app.ResolverActivity")
    startActivity(this)
}.let{//it:Intent
}
//可以这么写,因为apply返回值还是intent,执行顺序也是先apply再startActivity
startActivity(Intent(Intent.ACTION_MAIN).apply {
    addCategory(Intent.CATEGORY_HOME)
    setClassName("android", "com.android.internal.app.ResolverActivity")
    activity?.finish()
})

5、with – receiver: T, block: T.() -> R

  • Calls the specified function [block] with the given [receiver] as its receiver and returns its result.
  • 百度翻译:以给定的 [receiver] 作为其 接收器 调用指定的函数 [block],并返回其结果。
  • 个人理解:将接收部分(T)作为 this 传入 block 并返回 block 最后一行结果
with(Intent(Intent.ACTION_MAIN)){//this:Intent
    addCategory(Intent.CATEGORY_HOME)
    setClassName("android", "com.android.internal.app.ResolverActivity")
    startActivity(this)
}.let{//it:Unit
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值