概述

除了 ?.let 在作为安全可控性的时候好用外,with,apply 也是使用频率很高的。其中 apply 尤其好用。 在java 代码中想要链式编程,设置一个对象的属性时,往往跑到这个属性去把该set方法返回this,方便编程。或者更规范的另外建个 builder。然而在kotlin 里用apply 就可以了

with 函数

with 函数把第一个参数,作为lambda(第二个参数) 的接收者,可以用this访问,也可以省略 this。

  1. //本质是一个内联函数,第一个参数是目标对象,第二个参数是lambda. 返回值是lambda的返回值
  2. @kotlin.internal.InlineOnly
  3. public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
  4. contract {
  5. callsInPlace(block, InvocationKind.EXACTLY_ONCE)
  6. }
  7. return receiver.block()
  8. }

示例:

  1. fun testWith() {
  2. val strBuilder = StringBuilder()
  3. val reval = with(strBuilder) {
  4. append("1")
  5. append("➕")
  6. append("2")
  7. this.toString()
  8. }
  9. println(reval)
  10. }

apply

apply的功能和with类似,但是更方便。直接作为对象的方法函数,返回值为对象本身

  1. //是扩展函数(也是内联),参数为lambda表达式。返回值为该对象自己
  2. @kotlin.internal.InlineOnly
  3. public inline fun <T> T.apply(block: T.() -> Unit): T {
  4. contract {
  5. callsInPlace(block, InvocationKind.EXACTLY_ONCE)
  6. }
  7. block()
  8. return this
  9. }

示例

  1. fun testApply() {
  2. val strBuilder = StringBuilder()
  3. println(strBuilder.apply {
  4. append("1")
  5. append("➕")
  6. append("2")
  7. }.toString())
  8. }

————————————————

版权声明:本文为CSDN博主「大于弱智」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lckj686/java/article/details/82665840