我正在寻找一种惯用的方法,如果不是Kotlin中的变量,则返回。例如,我想要一些如:
for (item in list) {
getNullableValue(item).? let {
return it
}
}
但是不可能在Kotlin的let
区内返回。
有一个很好的方法可以做到这一点而不必这样做:
for (item in list) {
val nullableValue = getNullableValue(item)
if (nullableValue != null) {
return nullableValue
}
}
答案 0 :(得分:5)
可以从let
返回,您可以在documentation中阅读:
return-expression从最近的封闭函数返回,即foo。 (请注意,仅对传递给内联函数的lambda表达式支持此类非本地返回。)
let()
是一个inline
函数,因此只要您在return
内执行let
,就会自动从封闭函数返回,如下例所示:
fun foo() {
ints.forEach {
if (it == 0) return // nonlocal return from inside lambda directly to the caller of foo()
print(it)
}
}
要修改行为,"标签"可以使用:
fun foo() {
ints.forEach lit@ {
if (it == 0) return@lit
print(it)
}
}
答案 1 :(得分:4)
不确定这是否会被称为惯用语,但可以执行此操作:
val nullableValue = list.find { it != null }
if (nullableValue != null) {
return nullableValue
}
编辑:
根据s1m0nw1的回答,您可以将其减少到:
list.find { it != null }?.let {
return it
}
答案 2 :(得分:1)
"对"惯用的方法是使用"第一个"方法
示例:
val x = listOf<Int?>(null, null, 3, null, 8).first { it != null }
他的具体例子是
return list.first {getNullableValue(it) != null}
答案 3 :(得分:0)
我同意Ryba about using first,但这是使用continue
的另一种选择:
for (item in list) {
val nullableValue = getNullableValue(item) ?: continue
return nullableValue
}
这来自elvis运算符的“早期返回”原则,至少hinted at in the documentation,以及规则FoldInitializerAndIfToElvis中的linter建议。
答案 4 :(得分:0)
可能是这样的:
for (item in list) {
getNullableValue(item)?.also {
return it
}
}
我假设需要外部循环。如果不是这种情况,Ryba建议的解决方案应该起作用。