Kotlin 中 apply、let、also、run的区别

apply

apply 函数接收一个目标并回来该目标自身。它答应您在目标上履行一些操作,同时仍然回来原始目标。

fun <T> T.apply(block: T.() -> Unit): T

T 是目标的类型,block 是一个 lambda 表达式,能够在该目标上履行一些操作。在这个 lambda 中,您能够运用 this 关键字来引证当时目标。

val person = Person().apply {
    name = "John"
    age = 30
    address = "New York"
}

在这个例子中,咱们创建了一个 Person 目标并在 apply 函数中设置了该目标的特色。最终回来的是这个 Person 目标自身。

let

let 同样是一个扩展函数,它也接收一个 Lambda 表达式作为参数。不同于 apply,在 Lambda 表达式中,let 函数将接收者目标作为 Lambda 的参数,一般用 it 作为隐式称号。let 函数的回来值是 Lambda 表达式的成果。

fun <T, R> T.let(block: (T) -> R): R

T 是目标的类型,R 是回来值的类型,block 是一个 lambda 表达式,它对该目标进行一些操作并回来一个成果。

val person = Person("Alice", 25)
val ageAfterFiveYears = person.let {
    it.age + 5
}

在这个示例中,let 函数用于核算 Person 目标五年后的年纪。

also

also 是一个扩展函数,与 apply 相似,但有一个关键区别:also 函数的回来值是接收者目标自身,而 Lambda 表达式的参数是接收者目标,一般用 it 作为隐式称号。

fun <T> T.also(block: (T) -> Unit): T

T 是目标的类型,block 是一个 lambda 表达式,能够在该目标上履行一些操作。在这个 lambda 中,您能够运用 it 关键字来引证当时目标。

val person = Person("Alice", 25).also {
    it.name = "Bob"
    it.age = 30
}

在上述示例中,also 函数用于修正 Person 类的特色,最终回来修正后的目标。

run

run 是一个扩展函数,它结合了 apply 和 let 的特色。run 函数在 Lambda 表达式中直接访问接收者目标的特色和方法,同时回来 Lambda 表达式的成果。

fun <T, R> T.run(block: T.() -> R): R

T 是目标的类型,R 是回来值的类型,block 是一个 lambda 表达式,它对该目标进行一些操作并回来一个成果。在这个 lambda 中,您能够运用 this 关键字来引证当时目标。

val person = Person("Alice", 25)
val greeting = person.run {
    "Hello, $name! You are $age years old."
}

在这个示例中,run 函数用于生成一个包括 Person 目标信息的字符串。

总结

with不怎么使用,因为它确实不防空; 经常使用的是runapply

  1. run 闭包返回结果是闭包的执行结果;apply 返回的是调用者本身。
  2. 使用上的差别:run 更倾向于做一些其他复杂逻辑操作,而 apply 更多的是对调用者自身配置。
  3. 大部分情况下,如果不是对调用者本身进行设置,我会使用 run。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin的`let`是一个作用域函数,用于在特定的上下文执行代码块。它的主要用途是进行非空判断和链式调用。 使用`let`函数,您可以在可空对象上执行操作,同时避免了显式地进行null检查。它接收一个 lambda 表达式作为参数,并将调用对象作为 lambda 表达式的参数。 下面是一个示例: ```kotlin val name: String? = "John" name?.let { println("Name is not null: $it") // 在这里可以安全地操作非空的 name 对象 // 例如:访问它的属性或调用它的方法 } ``` 在上面的代码,我们首先对可空对象`name`进行了非空判断。如果`name`不为null,`let`函数会执行 lambda 表达式的代码,其`it`表示非空的`name`对象。在 lambda 表达式,我们可以安全地访问和操作该对象。 `let`函数还可以用于链式调用。例如: ```kotlin val numbers: List<Int>? = listOf(1, 2, 3, 4, 5) numbers?.let { it.filter { number -> number % 2 == 0 } }.let { it?.forEach { evenNumber -> println("Even number: $evenNumber") } } ``` 在上面的示例,我们首先对可空列表`numbers`进行了非空判断。然后,我们使用`let`函数在 lambda 表达式对列表进行过滤操作,并将结果赋给变量`it`。接下来,我们再次使用`let`函数在 lambda 表达式对过滤后的列表进行遍历操作。 总之,`let`函数是一种简洁而安全的方式来在特定上下文执行代码块,并处理可空对象的情况。它在 Kotlin 非常常用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值