also()、takeIf()、takeUnless()

对于任意接收器,有三个通用目的的扩展函数。

also方法就像apply方法,它会在接收器上执行一些行为。两者的区别在于:apply里面的代码块可以使用this,但是在also中的代码块只能使用it(当然,你可以修改为其他的名字)。这个区别在你想要隐藏this的时候非常有用。

fun Block.copy() = Block().also {
    it.content = this.content
}

takeIf就像filter,对于单个值使用。它检查一个接收器是否满足断言,如果满足将接收器返回,如果不满足将返回null。

val outDirFile = File(outputDir.path).takeIf { it.exists() } ?: return false
val index = input.indexOf(keyword).takeIf { it >= 0 } ?: error("keyword not found")

takeUnless与takeIf一样,但是它是做相反的断言。它在满足断言时返回null,不满足时返回接收器。因此上面的例子使用takeUnless实现如下所示:

val index = input.indexOf(keyword).takeUnless { it < 0 } ?: error("keyword not found")

同样如果有一个可以调用的引用可以很方便的替换lambda表达式。

val result = string.takeUnless(String::isEmpty)

results matching ""

    No results matching ""