首页 文章

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

提问于
浏览
3

我正在寻找一种惯用的方法来返回如果不是null在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 回答

  • 1

    可以从 let 返回,因为您可以在documentation中读取:

    return-expression从最近的封闭函数返回,即foo . (请注意,仅对传递给内联函数的lambda表达式支持此类非本地返回 . )

    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)
        }
    }
    
  • 4

    不确定这是否会被称为惯用语,但你可以这样做:

    val nullableValue = list.find { it != null }
    if (nullableValue != null) {
        return nullableValue
    }
    

    编辑:

    基于s1m0nw1的答案,您可以将其减少到:

    list.find { it != null }?.let {
        return it
    }
    
  • 0

    这种“正确”的惯用方法是使用“第一”方法 .

    例:

    val x = listOf<Int?>(null, null, 3, null, 8).first { it != null }

    他的具体例子是

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

  • 0

    我同意Ryba about using first,但这是使用 continue 的另一种选择:

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

    这遵循"early returns"的原则,通过elvis运算符,至少hinted at in the documentation,以及规则FoldInitializerAndIfToElvis中的linter建议 .

  • 4

    它可能是这样的:

    for (item in list) {
      getNullableValue(item)?.also {
        return it
      }
    }
    

    我假设需要外部循环 . 如果不是这样,Ryba建议解决方案应该有效 .

相关问题