Kotlin 假设 value 不为 null

fir*_*ter 1 kotlin

我有下面的代码来从列表中选择第一个项目,其中该项目的姓氏字段值不应该是UNKNOWNor MISSING

val userLastName = someList
      .first { it.lastName != "UNKNOWN" && it.lastName != "MISSING" }
      .lastName
Run Code Online (Sandbox Code Playgroud)

现在 Intellij 说字段 userLastName 永远不能为空。为什么?

如果列表中的所有对象的lastName字段值为 或UNKNOWNMISSING那么该userLastName变量将为空,对吧?

我尝试更改代码以使用 null 安全运算符:

val userLastName = someList
          .first { it.lastName != "UNKNOWN" && it.lastName != "MISSING" }
          ?.lastName
Run Code Online (Sandbox Code Playgroud)

但我收到以下警告:

Safe call on a non-null receiver will have nullable type in future releases
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 5

.first函数要求至少有一个元素与谓词匹配。如果没有找到匹配的元素,它会抛出异常。

如果您想null在没有元素匹配时返回,可以使用.find代替.first

  • 或“firstOrNull”(/sf/ask/3186418721/) (5认同)
  • `as` 在 Kotlin 中被称为“不安全”强制转换运算符](https://kotlinlang.org/docs/typecasts.html#unsafe-cast-operator),因为它允许您尝试可能不会成功的强制转换。如果无法进行转换,它将抛出异常。`x as SomeType` 与 `x!!` 类似,如果 `x` 为 `null`,它会失败并出现异常。 (3认同)