以下两种实现中哪一种更好:
1.使用"如果"
fun f1(a: A?): R? {
if (a != null) {
val b = getB(a)
if (b != null && b.f()) {
val c = getC(b)
if (c != null && c.f()) {
return c.f2()
}
}
}
return null
}
2.use" takeIf"和"让"
fun f2(a: A?): R? = a
?.let { getB(it) }
?.takeIf { it.f() }
?.let { getC(it) }
?.takeIf { it.f() }
?.let { it.f2() }
答案 0 :(得分:4)
“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级嵌套if条件。
希望它有所帮助。
答案 1 :(得分:3)
这是一个主观问题。有些人喜欢一个版本,有些人喜欢另一个版本 就个人而言,我认为这更具可读性:
fun f3(a: A?): R? {
if (a == null) {
return null
}
val b = getB(a)
if (b == null || !b.f()) {
return null
}
val c = getC(b)
if (c == null || !c.f()) {
return null
}
return c.f2()
}
答案 2 :(得分:0)
此示例中的let / takeIf非常难以阅读。也许不同的缩进会有所帮助,但是函数名称如此虚假并且每个get的结果具有相同名称的'f'函数都会导致问题。
在更正常的情况下,让我们可以高度阅读。
在这个人工案例中分析单独的语句,无论是使用let / takeIf还是传统的'if'都有助于这个例子。