[英]Checking if LocalDateTIme is null in a conditional
在這里,我有一個函數將字符串格式化為 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 類型的變量是否為空?
java.time.LocalDateTime
類的方法parse(CharSequence, DateTimeFormatter)
不接受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
(所以即使它是一個var
,它仍然不能為空)。
正如所寫,檢查 null 沒有意義,您的 IDE 會警告您檢查毫無意義!
但是,如果它可以為空,則有多種空檢查選項,具體取決於您想用它做什么:
一個簡單的if (dateSentFormatted != null)
測試,根據您的代碼(但沒有無關緊要的!
)。 這是傳統的方式,有時仍然是最清晰的。
其他if ()
測試。 Kotlin 的標准庫提供了一些方法來使空檢查更簡潔和/或更易讀,例如:
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
...除了如果這些對象中的任何一個同時更新,它都不會失敗。
非空斷言運算符!!
. 如果確定此時該值不能為空,則此運算符會告訴編譯器您更清楚。 (如果你錯了,你會得到一個運行時異常。)例如:
someFunctionCall(dateSentFormatted!!)
運行時錯誤的可能性意味着這很少是一個好的選擇(這就是為什么他們讓它看起來很可怕)。
更復雜的事情,取決於你想要做什么......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.