Проверка, является ли LocalDateTIme нулевым в условном выражении - PullRequest
0 голосов
/ 11 марта 2020

Здесь у меня есть функция, которая форматирует строку в 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 ) {

}

Но это не нравится, как еще я могу проверить, является ли переменная типа LocalDateTime пустой в операторе if?

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Как написано, dateSentFormatted не может быть нулевым: вы устанавливаете его равным возврату от timeFormatted(), который возвращает LocalDateTime, который не может быть равен нулю. (В отличие от LocalDateTime?, который был бы.)

И поскольку вы не указали его тип, компилятор выводит LocalDateTime (поэтому, даже если бы он был var, он все равно никогда не мог бы быть нулевым ).

Итак, как написано, нет смысла проверять нулевое значение, и ваша IDE предупредит вас, что проверка бессмысленна!

Однако, если бы она была обнуляемой, тогда есть различные варианты проверки на нуль, в зависимости от того, что вы хотите с ней сделать:

  • Простой if (dateSentFormatted != null) тест, согласно вашему коду (но без посторонних * 1022). *). Это традиционный способ, и он до сих пор порой самый ясный.

  • Прочие if () тесты. Стандартная библиотека Kotlin предоставляет несколько способов сделать нулевые проверки более краткими и / или более читабельными, например:

    if (someString.isNullOrEmpty())
        // …
    
  • Оператор elvis ?:, который возвращает его левую сторону, если это не ноль, иначе его правая сторона. Это полезно для предоставления значения по умолчанию / запасного значения, если оно не указано, например:

    someFunctionCall(dateSentFormatted ?: LocalDateTime.now())
    

    , что примерно соответствует значению:

    someFunctionCall(if (dateSentFormatted != null) dateSentFormatted else LocalDateTime.now())
    
  • Сейф -call оператор ?., который вызывает метод / получатель, только если LHS не равен NULL, иначе он дает 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!!)
    

    Потенциал для ошибок времени выполнения означает, что это редко хороший выбор (именно поэтому они заставили его выглядеть страшно ).

  • Нечто более сложное, в зависимости от того, что вы пытаетесь сделать ...

1 голос
/ 11 марта 2020

Метод 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

Последняя часть остается за вами, а остальная часть в значительной степени обязательна, если вы хотите реализовать функциональность, описанную в вашем вопросе.

1 голос
/ 11 марта 2020

Предполагая, что dateSentFormatted является переменной типа LocalDateTime, вы можете проверить, имеет ли она значение null:

if (dateSentFormatted != null ) {
    // dateSentFormatted is not null
}

Вам не нужна первая !.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...