Kotlin作用域函数 let、also、with、run、apply使用速览

147 阅读1分钟

.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

如果...则take lambda内执行 take 的条件, 不符合条件则返回 null

// fun <T> T.takeIf(predicate: (T) -> Boolean): T?
val age =  
    stu.takeIf { it.age > 18 }?.age 
	?: throw IllegalArgumentException("年龄太小, 只允许 18岁以上 ")

.takeUnless

除非...则take lambda内执行 不 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} !")  
}

区别表

函数对象引用返回值是否是扩展函数
letitLambda 表达式结果
runthisLambda 表达式结果
run-Lambda 表达式结果不是:调用无需上下文对象
withthisLambda 表达式结果不是:把上下文对象当做参数
applythis上下文对象
alsoit上下文对象

相关参考

kotlinlang.org/docs/scope-…