簡體   English   中英

在條件中檢查 LocalDateTIme 是否為空

[英]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? .

而且,由於如果在dateEmailSentnull情況下不使用它,則創建解析器/格式化程序沒有意義,因此我建議按如下方式重寫整個函數:

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

最后一部分取決於您,如果您想實現您在問題中描述的功能,其余部分幾乎是強制性的。

假設dateSentFormattedLocalDateTime類型的變量,您可以檢查它是否為空:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM