检查条件中 LocalDateTIme 是否为 null

新手上路,请多包涵

在这里,我有一个将字符串格式化为 LocalDateTime 并将其返回的函数。

 val dateSentFormatted = timeFormatted(record.data.dateTime);

 private fun timeFormatted(dateEmailSent: String?): LocalDateTime {
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd:HH:mm:ss");
    return LocalDateTime.parse(dateEmailSent, formatter);
}

我的问题是我想在我文件的其他地方运行一个 if 语句来检查它是否为空,如下所示:

 if (!dateSentFormatted != null ) {

}

但它不喜欢那样,我还能如何检查 if 语句中 LocalDateTime 类型的变量是否为空?

原文由 sisternight438 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 4.2k
2 个回答

Method parse(CharSequence, DateTimeFormatter) of the java.time.LocalDateTime class does not accept null as the character sequence (first parameter), so you have to make an explicit null 检查并将函数的返回重写为

return if (dateEmailSent != null) LocalDateTime.parse(dateEmailSent, formatter) else null

(顺便说一句,你不必有分号( ; ))

此外,所写函数的返回类型不可为空,因此您必须将其更改为 LocalDateTime?

而且,如果在 dateEmailSentnull 的情况下不使用它,那么创建解析器/格式化程序是没有意义的,我建议按如下方式重写整个函数:

 fun timeFormatted(dateEmailSent: String?) = if (dateEmailSent != null) {
    LocalDateTime.parse(dateEmailSent, DateTimeFormatter.ofPattern("yyyy-MM-dd:HH:mm:ss"))
} else null

最后一部分由您决定,如果您想实现问题中描述的功能,其余部分几乎是强制性的。

原文由 ysakhno 发布,翻译遵循 CC BY-SA 4.0 许可协议

如所写, dateSentFormatted 不能 为空:您将其设置为来自 timeFormatted() 的返回,它返回一个 LocalDateTime null-fe4。 (不像 LocalDateTime? ,它会是。)

因为您没有指定它的类型,编译器会推断 LocalDateTime (所以即使它是 var ,它仍然永远不会为空)。

因此,正如所写的那样,检查 null 是没有意义的,您的 IDE 会警告您该检查毫无意义!

但是,如果它可以 null,则有多种选项可用于 null 检查,具体取决于您要对其执行的操作:

  • 一个简单的 if (dateSentFormatted != null) 测试,根据您的代码(但没有无关的 ! )。这是传统的方式,有时仍然是最清晰的。

  • 其他 if () 测试。 Kotlin 的标准库提供了一些方法来使 null 检查更简洁和/或更具可读性,例如:

   if (someString.isNullOrEmpty())
      // …

  • elvis 运算符 ?: ,如果不为空,则生成其左侧,否则生成其右侧。如果未指定,这对于提供默认/回退值很有用,例如:
   someFunctionCall(dateSentFormatted ?: LocalDateTime.now())

这意味着大致相同:

   someFunctionCall(if (dateSentFormatted != null) dateSentFormatted else LocalDateTime.now())

  • 安全调用运算符 ?. ,仅当 LHS 不为 null 时才调用方法/getter,否则直接返回 null。这在遵循对象链时很有用,例如:
   val postcode = employee?.manager?.address?.postcode

这意味着大致相同:

   val postcode = if (employee == null)
      null
  else if (employee.manager == null)
      null
  else if (employee.manager.address == null)
      null
  else
      employee.manager.address.postcode

…除了如果这些对象中的任何一个同时更新它不会失败。

  • 非空断言运算符 !! 。如果此时确定该值不能为 null,则此运算符会告诉编译器您知道得更多。 (如果你错了,你会得到一个运行时异常。)例如:
   someFunctionCall(dateSentFormatted!!)

运行时错误的可能性意味着这很少是一个好的选择(这就是为什么他们让它看起来很可怕)。

  • 更复杂的东西,取决于你想做什么……

原文由 gidds 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题