在Kotlin中如果不是null,则返回原地方式
我正在寻找一种惯用的方式来返回如果不是null在Kotlin中的variables。 例如,我想要的东西如:
for (item in list) { getNullableValue(item).? let { return it } }
但是不可能在Kotlin的一个区块里面回来。
有没有一个好办法做到这一点,而不必这样做:
for (item in list) { val nullableValue = getNullableValue(item) if (nullableValue != null) { return nullableValue } }
不知道这是否会被称为惯用,但你可以这样做:
val nullableValue = list.find { it != null } if (nullableValue != null) { return nullableValue }
编辑:
根据s1m0nw1的回答,你可以减少到这个:
list.find { it != null }?.let { return it }
可以从let
返回,如下所示:
return-expression从最近的封闭函数(即foo)返回。 (请注意,只有传递给内联函数的lambdaexpression式才支持这种非本地返回。)
let()
是一个inline
函数,因此,只要您在let
内部返回,就会自动从封闭函数return
,如下例所示:
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) } }
这样做的“正确”惯用方法是使用“第一”方法。
例:
val x = listOf
他的具体例子是
return list.first {getNullableValue(it) != null}
我同意Ryba有关使用第一 ,但这里是另一种使用continue
:
for (item in list) { val nullableValue = getNullableValue(item) ?: continue return nullableValue }
这从“早期收益”的原则通过elvis算子,这至少在文档中暗示 ,以及规则FoldInitializerAndIfToElvis中的linter建议 。