.run (不是 run)
this引用, 返回结果
fun <R> run(block: () -> R): R
val age = stu.run {
print("my name is $name")
age
}
run
不是扩展函数, 无引用, 返回
结果
// fun <R> run(block: () -> R): R
val age = run {
val stu = Student(17, "张三")
println("I am ${stu.name} !")
stu.age
}
with
不是扩展函数,
this引用, 返回结果
// fun <T, R> with(receiver: T, block: T.() -> R): R
val age = with(stu) {
print("my name is $name")
age
}
.apply
this引用, 返回自身
// fun <T> T.apply(block: T.() -> Unit): T
val stu = stu.apply {
print("my name is $name")
age // 无意义
}
.also
it引用, 返回自身
// fun <T> T.also(block: (T) -> Unit): T
val stu = stu.also {
print("my name is ${it.name}")
it.age // 无意义
}
.let
it引用, 返回结果
// fun <T, R> T.let(block: (T) -> R): R
val age = student.let{
print("my name is ${it.name}")
it.age
}
.takeIf
如果...则takelambda内执行 take 的条件, 不符合条件则返回 null
// fun <T> T.takeIf(predicate: (T) -> Boolean): T?
val age =
stu.takeIf { it.age > 18 }?.age
?: throw IllegalArgumentException("年龄太小, 只允许 18岁以上 ")
.takeUnless
除非...则takelambda内执行 不 take 的条件, 符合条件则返回 null
// fun <T> T.takeUnless(predicate: (T) -> Boolean): T?
val age =
stu.takeUnless { it.age > 18 }?.age
?: throw IllegalArgumentException("年龄太大, 不允许 18岁以上 ")
repeat
不是扩展函数
// fun repeat(times: Int, action: (Int) -> Unit)
repeat(10) { // 重复执行10次
println("I am ${stu.name} !")
}
区别表
| 函数 | 对象引用 | 返回值 | 是否是扩展函数 |
|---|---|---|---|
let | it | Lambda 表达式结果 | 是 |
run | this | Lambda 表达式结果 | 是 |
run | - | Lambda 表达式结果 | 不是:调用无需上下文对象 |
with | this | Lambda 表达式结果 | 不是:把上下文对象当做参数 |
apply | this | 上下文对象 | 是 |
also | it | 上下文对象 | 是 |