"如果" vs." takeIf"在科特林?

时间:2017-09-12 09:50:53

标签: kotlin

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

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() }

3 个答案:

答案 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'都有助于这个例子。