以下代码(简化示例):
/** Determine if a is less than 15 and b is more than 15. **/
fun isFifteenBetween(val a: Int, val b: Int) {
if((a < 15) && (b > 15)) { return(true) }
else { return(false) }
}
应该让isFifteenBetween(3, 20)
返回true,isFifteenBetween(20, 3)
返回false。但是,我从Android studio(v3.4)获得以下建议:
Return should be lifted out of 'if'
Inspection info: This inspection reports if, when and try statements
that can be converted to expressions by lifting a return or an assignment out.
Typical example:
fun foo(arg: Boolean): String {
when (arg) {
true -> return "Truth"
false -> return "Falsehood"
}
}
我在stackoverflow上找到的唯一相关问题是Kotlin: Return can be lifted out of 'when',但我认为这似乎并不能涵盖我的情况。
官方惯例是更愿意返回表达本身:https://kotlinlang.org/docs/reference/coding-conventions.html#using-conditional-statements
这说来android studio的例子应该成为:
return when (arg) {
true -> "Truth"
false -> "Falsehood"
}
这会将isFifteenBetween
的代码更改为:
/** Determine if a is less than 15 and b is more than 15. **/
fun isFifteenBetween(val a: Int, val b: Int) {
return if((a < 15) && (b > 15)) true
else false
}
在性能方面,两种选择几乎相同。
这些答案可能会受到我的意见的影响。但我认为背后的原因或多或少。返回表达式的事实在读取代码时会产生直接影响。您知道该陈述的结果将是详尽无遗的,并且您拥有每个分支都已被处理的信息。
我认为这是一种最佳实践,因为在某些情况下,使分支条件穷尽可能会使编译器在忘记某些新条件时给出错误。不仅仅是密封课程。进一步阅读:https://proandroiddev.com/til-when-is-when-exhaustive-31d69f630a8b
消息很清楚:
此检查通过提取退货或分配来报告if,when和try语句是否可以转换为表达式。
它说明了以下事实:
在Kotlin中,if是一个表达式,即它返回一个值。
你可以在这里找到更多:https://kotlinlang.org/docs/reference/control-flow.html#if-expression 在您的情况下,您可以返回如下结果:
return if((a < 15) && (b > 15)) true else false
所以这:
if((a < 15) && (b > 15)) true else false
是一个表达式,其值由return
返回。
这个表达式可以进一步简化(但与你的问题无关):
return (a < 15) && (b > 15)
在Kotlin中从java替换switch-operator时,但主要区别在于何时是表达式,因此它可以返回结果。为了更好地理解在Kotlin中使用when-expression的方法,你可以看一下lambdas。 when-operator只在每个case之后返回'lambda'的结果。
即使你写
when(a) {
1 -> println("one")
else -> println("something else")
}
此表示法返回函数println(...)的结果,返回Unit。因此,当您复制“return”时,它不是编写代码的最佳方式。
val result = when(a) {
1 -> println("one")
else -> println("something else")
}
// and now result equals to Unit-object
同样的故事是if-else,也就是表达。