kotlin标准函数-with、let、run、apply、also

最近在面试,我自认为kotlin用的还比较熟练,但竟然被一个问题问倒了,感觉有点失败,事后翻了下笔记,特此记录一下。

面试官:你说你kotlin用的贼6,那说下with、let、run、apply、also的区别?
我:嗯...,要不你还是换个问题吧?
面试官:出门右拐,把门带上。

回到家赶紧复习下,简单说下它们的区别。

with

特点:

  • 传入参数为this,可以直接调用this的属性和函数;
  • 返回值可以是任意类型;

缺点:

  • 不支持非null检验;
  • 不支持链式调用;

示例如下:

with函数

源码如下:

@kotlin.internal.InlineOnly
public inline fun  with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

let

特点:

  • 可以在表达式执行前进行非null检验;
  • 传入参数为it,需要用it来调用属性和函数;
  • 返回值可以是任意类型,且支持链式调用;

示例如下:

let函数

源码如下:

@kotlin.internal.InlineOnly
public inline fun  T.let(block: (T) -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block(this)
}

run

特点:

  • 可以在表达式执行前进行非null效验;
  • 传入参数为this,可以直接调用this的属性和函数
  • 返回值为任意类型,且支持链式调用
  • 可以说是结合了with和let函数的优点;

示例如下:


run函数

源码如下:

@kotlin.internal.InlineOnly
public inline fun  T.run(block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

apply

特点:

  • 可以在表达式执行前进行非null校验;
  • 传入参数为this;
  • 返回值固定为this自身类型,最后一个值不会返回;

示例如下:


apply函数

源码如下:

@kotlin.internal.InlineOnly
public inline fun  T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

also

特点:

  • 可以在表达式执行前进行非null校验;
  • 传入参数为it;
  • 返回值固定为this自身类型,最后一个值不会返回;

示例如下:


also函数

源码如下:

@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun  T.also(block: (T) -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block(this)
    return this
}

最后,用一张图进行总结,如下:


kotlin标准函数

你可能感兴趣的:(kotlin标准函数-with、let、run、apply、also)