Изменить: or
Java 9 и более поздние версии предлагают очень элегантное решение:
Optional<String> myFunc() {
return func1().or(this::func2);
}
or
(представленный в Java 9) делает именно то, о чем вы просили: если Optional
, возвращаемое из func1
, имеет значение, оно возвращается (или эквивалентное Optional
). Если нет, вызывается поставщик (здесь func2()
) для получения Optional
, который затем возвращается.
Ява 8
Есть несколько способов. В Java 8 я предпочитаю брать значения из Optional
из func1
и func2
:
Optional<String> myFunc() {
String returnValue = func1().orElse(func2().orElse(null));
return Optional.ofNullable(returnValue);
}
Редактировать 2: альтернативное предложение @Holger в комментарии достаточно хорошо для цитирования в ответе (Хольгер, возможно, вы разместили его как комментарий только потому, что вопрос закрыт, и поэтому вы не могли опубликовать свой собственный отвечать):
return func1().map(Optional::of).orElse(func2());
Это происходит наоборот: отображение с использованием Optional::of
оборачивает Optional
из func1
внутрь, но Optional
только в том случае, если оно имеет значение, из которого orElse
снова разворачивает его.
Если вызов func2
обходится дорого, вы можете избежать его, когда он не нужен (когда func1
предоставляет значение):
String returnValue = func1().orElseGet(() -> func2().orElse(null));
Или в версии Хольгера:
return func1().map(Optional::of).orElseGet(this::func2);
isPresent
, используемый в нескольких других ответах, настолько низкоуровневый, что я использую его редко и только в крайнем случае.
person
Ole V.V.
schedule
18.01.2019
func1
иfunc2
? Если это методы, переформатируйте код, чтобы он был действительным. Предоставьте ожидаемые входные данные и желаемые результаты. Укажитеif-else
, чтобы сделать вопрос более ясным. - person Nikolas Charalambidis   schedule 18.01.2019if-else
для трудночитаемого способа? - person vincrichaud   schedule 18.01.2019if-else
, чтобы было очевидно, чего вы пытаетесь достичь. - person Michael   schedule 18.01.2019