这里有一个将字符串格式化为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类型的变量是否为空?
C0]类的[方法parse(CharSequence, DateTimeFormatter)
不接受java.time.LocalDateTime
作为字符序列(第一个参数),因此您必须进行显式的null
检查并将函数的返回值重写为
null
(顺便说一下,您不必使用分号(return if (dateEmailSent != null) LocalDateTime.parse(dateEmailSent, formatter) else null
))
此外,编写的函数的返回类型不可为空,因此您必须将其更改为;
。
而且,如果在LocalDateTime?
为dateEmailSent
的情况下不使用解析器/格式器,则没有必要创建解析器/格式器,我建议如下重写整个函数:
null
最后一部分取决于您,如果您想实现问题中描述的功能,其余部分几乎是必需的。
假设fun timeFormatted(dateEmailSent: String?) = if (dateEmailSent != null) {
LocalDateTime.parse(dateEmailSent, DateTimeFormatter.ofPattern("yyyy-MM-dd:HH:mm:ss"))
} else null
是类型为dateSentFormatted
的变量,您可以检查其是否为空:
LocalDateTime
您不需要第一个if (dateSentFormatted != null ) {
// dateSentFormatted is not null
}
。
如所写,!
不能为空:您将其设置为从dateSentFormatted
返回的值,该值返回一个timeFormatted()
,该值不能为空。 (与LocalDateTime
不同,它将是。)
并且因为您尚未指定其类型,所以编译器会推断LocalDateTime?
(因此即使它是LocalDateTime
,它也永远不会为空)。
因此,如前所述,检查null没有意义,您的IDE会警告您该检查毫无意义!
但是,如果它were可为空,则根据您想对它进行什么操作,可以使用各种选项进行空检查:
根据您的代码的简单var
测试(但没有多余的if (dateSentFormatted != null)
)。这是传统方式,有时仍然是最清晰的方式。
其他!
测试。 Kotlin的标准库提供了几种使空检查更简洁和/或更易读的方法,例如:]
if ()
elvis运算符if (someString.isNullOrEmpty())
// …
,如果不为null,则产生其左侧,否则为右侧。如果未指定默认值/后备值,则此功能非常有用,例如:
?:
这与:大致相同:
?:
安全调用运算符someFunctionCall(dateSentFormatted ?: LocalDateTime.now())
,仅当LHS不为null时才调用方法/获取器,否则它直接为null。当跟随对象链时,这很有用,例如:
someFunctionCall(if (dateSentFormatted != null) dateSentFormatted else LocalDateTime.now())
这与:大致相同:
?.
……如果同时更新任何这些对象,它将不会失败。
非null断言运算符?.
。如果确定此时该值不能为null,则此运算符告诉编译器您更了解。 (如果输入错误,则会出现运行时异常。)例如:
val postcode = employee?.manager?.address?.postcode
潜在的运行时错误意味着这很少是一个不错的选择(这就是为什么它们看起来很恐怖的原因。)>
更复杂,取决于您要执行的操作...