在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(null, null, 3, null, 8).first { it != null }

他的具体例子是

return list.first {getNullableValue(it) != null}

我同意Ryba有关使用第一 ,但这里是另一种使用continue

 for (item in list) { val nullableValue = getNullableValue(item) ?: continue return nullableValue } 

这从“早期收益”的原则通过elvis算子,这至少在文档中暗示 ,以及规则FoldInitializerAndIfToElvis中的linter建议 。