以下代码(简化示例):
/** 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',但我认为这似乎还不能解决我的情况。
答案 0 :(得分:2)
消息很清楚:
此检查报告是否,何时以及可以尝试 通过取消返回或赋值转换为表达式。
它指出以下事实:
在Kotlin中,如果是表达式,即返回值。
您可以在此处找到更多信息: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)
答案 1 :(得分:1)
官方约定最好返回表达式本身: 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
答案 2 :(得分:0)
在Kotlin中,何时从Java替换 switch-operator ,但主要区别在于 when 是表达式 ,因此可以返回结果。 为了更好地了解在Kotlin中进行表达式时的工作方式,您可以看一下lambda。在每种情况下,当when运算符仅返回其“ lambda”的结果。
即使你写
when(a) {
1 -> println("one")
else -> println("something else")
}
此符号返回函数println(...)的结果,该结果返回Unit。因此,当您重复此“返回”时,这不是编写代码的最佳方法。
val result = when(a) {
1 -> println("one")
else -> println("something else")
}
// and now result equals to Unit-object
if-else也有同样的故事,也就是表达式。