Опции Java: не нуль и метод ИЛИ значение по умолчанию

Как я могу сделать это короче/элегантнее с помощью опции??

ZonedDateTime zdt = getMyTime ();   // returns ZonedDateTime or null
String zdtstr = "";
if (zdt != null)
{
    zdtstr = zdt.format (myformatter);
}
else
{
    zdtstr = "???";
}

Я попробовал Optional.isPresentorElse, но он не возвращает результат (строка, которая мне нужна в моем образце).

Попробуйте с map и orElse

Federico klez Culloca 18.04.2023 12:11
zdtstr = (zdt == null) ? "???" : zdt.format(myformatter);?! (нет для создания дополнительного экземпляра, пара вызовов методов, ....)
user16320675 18.04.2023 12:14

Не вижу смысла. Если ваш метод не возвращает Optional для начала, можно просто использовать тернарный оператор: String zdtstr = zdt != null ? zdt.format(myformatter) : "???";

Robby Cornelissen 18.04.2023 12:15

Я бы подумал об изменении getMyTime, чтобы вернуть необязательное значение. Тогда вы можете String zdtstr = getMyTime().map(myformatter::format).orElse("???");

marstran 18.04.2023 12:17

Когда null является законным возвращаемым значением метода, этот метод должен возвращать Optional.

Basil Bourque 18.04.2023 13:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
83
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать ofNullable, чтобы перевести null в пустой Optional, а затем использовать orElse.

String zdtStr = Optional.ofNullable(getMyTime())
 .map(zdt -> zdt.format(myformatter));
 .orElse("???");

Хотя это не короче. Или, только если вы обманываете и используете предвзятые правила руководства по стилю, и в этом случае я могу сделать его еще короче, удалив из этого все пробелы, что кажется глупым.

rzwitserloot 18.04.2023 12:15

@rzwitserloot Не уверен, что вы имеете в виду, я считаю, что 3 строки короче, чем 5. И я нахожу это более элегантным, но, конечно, это всегда вопрос вкуса.

daniu 18.04.2023 12:19

Для if вы ДОЛЖНЫ использовать фигурные скобки, но с лямбда-функциями вы этого не делаете? Тогда проблема в руководстве по стилю, а не в том, что лямбда-выражения короче простого if.

rzwitserloot 18.04.2023 12:24

На какое руководство по стилю вы все время ссылаетесь? ОП задавал вопрос, как преобразовать его код в конструкцию Optional, я ответил. Не уверен, как отсутствие фигурных скобок вокруг лямбды делает это недействительным (и, между прочим, я все равно не считал фигурные скобки строками).

daniu 18.04.2023 12:30

Тот, который заставляет вас сказать: «с if это 5 строк, но с .ofNullable это 3. Это не имеет смысла, если только ваше руководство по стилю не указывает, что if ДОЛЖЕН использовать фигурные скобки, но также говорит, что лямбда не обязательно, что противоречиво. .

rzwitserloot 18.04.2023 12:47

@rzwitserloot Я говорю о логических линиях, то есть о утверждениях.

daniu 18.04.2023 13:05

Посмотрите ответ Xiidref, который делает это за 2, если вы идете по этой метрике. Если getMyTime(), как предполагает get, не дорого, он может сделать это за 1.

rzwitserloot 18.04.2023 15:36

Я знаю тернарный оператор и использую его довольно часто. Это не «моя метрика», оп явно спрашивал о «короче» и «необязательно».

daniu 18.04.2023 17:57
Ответ принят как подходящий

Вы можете просто использовать тернарный оператор:

ZonedDateTime zdt = getMyTime();
String zdtstr = (zdt != null) ? zdt.format(myformatter) : "???";

если getMyTime() может возвращать null, вы даже можете заставить этот геттер возвращать Optional в первую очередь.

Optional<ZonedDateTime> getMyTime() { 
    return Optional.ofNullable(myTime); 
}

В результате вы можете использовать его красиво, декларативно и с нулевой безопасностью:

getMyTime()
  .map(zdt -> zdt.format(myformatter));
  .orElse("???");

Другие вопросы по теме