Kotlin中的“if”与“takeIf”?

以下两种实现中的哪一种更好:

用“如果”

fun f1(a: A?): R? { if (a != null) { val b = getB(a) if (b != null && bf()) { val c = getC(b) if (c != null && cf()) { return c.f2() } } } return null } 

用“takeIf”和“let”

 fun f2(a: A?): R? = a ?.let { getB(it) } ?.takeIf { it.f() } ?.let { getC(it) } ?.takeIf { it.f() } ?.let { it.f2() } 

“takeIf”和“let”是更好的方法。 虽然起初有点困难,但是如果您将会体验到lambda表达式,那么您会发现它们确实有帮助。

Kotlin是新的语言,其中一个好处就是删除样板代码。

 fun f2(a: A?): R? = a ?.let { getB(it) } ?.takeIf { it.f() } ?.let { getC(it) } ?.takeIf { it.f() } ?.let { it.f2() } 

这段代码就是这样做的。 它只是删除丑陋的4级嵌套的条件。

希望它有帮助。

这是一个主观的问题。 有些人喜欢一个版本,其他人喜欢另一个。 我个人认为这更可读:

 fun f3(a: A?): R? { if (a == null) { return null } val b = getB(a) if (b == null || !bf()) { return null } val c = getC(b) if (c == null || !cf()) { return null } return c.f2() } 

在这个例子中let / takeIf是很难读的。 也许不同的缩进会有所帮助,但是这个函数的名字是如此虚构的,而且每个得到的结果都有一个相同的名字“f”函数都会导致这个问题。

让和takeIf可以在更正常的情况下高度可读。

在这个假设的情况下分解成单独的语句,无论是使用let / takeIf还是传统的“if”都有助于这个例子。