Как я могу сделать это короче/элегантнее с помощью опции??
ZonedDateTime zdt = getMyTime (); // returns ZonedDateTime or null
String zdtstr = "";
if (zdt != null)
{
zdtstr = zdt.format (myformatter);
}
else
{
zdtstr = "???";
}
Я попробовал Optional.isPresentorElse, но он не возвращает результат (строка, которая мне нужна в моем образце).
zdtstr = (zdt == null) ? "???" : zdt.format(myformatter);?! (нет для создания дополнительного экземпляра, пара вызовов методов, ....)
Не вижу смысла. Если ваш метод не возвращает Optional для начала, можно просто использовать тернарный оператор: String zdtstr = zdt != null ? zdt.format(myformatter) : "???";
Я бы подумал об изменении getMyTime, чтобы вернуть необязательное значение. Тогда вы можете String zdtstr = getMyTime().map(myformatter::format).orElse("???");
Когда null является законным возвращаемым значением метода, этот метод должен возвращать Optional.




Вы можете использовать ofNullable, чтобы перевести null в пустой Optional, а затем использовать orElse.
String zdtStr = Optional.ofNullable(getMyTime())
.map(zdt -> zdt.format(myformatter));
.orElse("???");
Хотя это не короче. Или, только если вы обманываете и используете предвзятые правила руководства по стилю, и в этом случае я могу сделать его еще короче, удалив из этого все пробелы, что кажется глупым.
@rzwitserloot Не уверен, что вы имеете в виду, я считаю, что 3 строки короче, чем 5. И я нахожу это более элегантным, но, конечно, это всегда вопрос вкуса.
Для if вы ДОЛЖНЫ использовать фигурные скобки, но с лямбда-функциями вы этого не делаете? Тогда проблема в руководстве по стилю, а не в том, что лямбда-выражения короче простого if.
На какое руководство по стилю вы все время ссылаетесь? ОП задавал вопрос, как преобразовать его код в конструкцию Optional, я ответил. Не уверен, как отсутствие фигурных скобок вокруг лямбды делает это недействительным (и, между прочим, я все равно не считал фигурные скобки строками).
Тот, который заставляет вас сказать: «с if это 5 строк, но с .ofNullable это 3. Это не имеет смысла, если только ваше руководство по стилю не указывает, что if ДОЛЖЕН использовать фигурные скобки, но также говорит, что лямбда не обязательно, что противоречиво. .
@rzwitserloot Я говорю о логических линиях, то есть о утверждениях.
Посмотрите ответ Xiidref, который делает это за 2, если вы идете по этой метрике. Если getMyTime(), как предполагает get, не дорого, он может сделать это за 1.
Я знаю тернарный оператор и использую его довольно часто. Это не «моя метрика», оп явно спрашивал о «короче» и «необязательно».
Вы можете просто использовать тернарный оператор:
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("???");
Попробуйте с
mapиorElse