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)