在Kotlin中返回的惯用方法,如果不为null

时间:2017-09-04 00:16:28

标签: kotlin

我正在寻找一种惯用的方法,如果不是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
  }
}

5 个答案:

答案 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建议的解决方案应该起作用。