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