Статические средства, один экземпляр для каждого класса, статическая переменная, созданная один раз и может быть разделена между разными объектами.
Конечная переменная, после инициализации значения не может быть изменена. Конечная статическая переменная используется для создания постоянной (неизменяемой) и ссылки непосредственно без использования объекта.
Было бы что-то вроде этого, если бы я все правильно понял:
Optional.of(obj1)
.filter(obj -> func1().isPresent())
.orElse(func2());
Если вы используете Java 9+ , вы можете просто использовать Optional.or
:
return func1().or(() -> func2());
В Java 8 , вам может понадобиться создать новый Опциональный из результатов (используйте orElseGet
, чтобы избежать нетерпеливого выполнения):
return Optional.ofNullable(func1().orElseGet(() -> func2().orElse(null)));
Вот более общая версия, работающая с n
функциями:
private static <T> Optional<T> firstPresent(Supplier<Optional<T>>... optionals) {
return Stream.of(optionals)
.map(Supplier::get)
.filter(Optional::isPresent)
.findFirst()
.orElse(Optional.empty());
}
.
or
Java 9 и более поздние версии предлагают очень элегантное решение:
Optional<String> myFunc() {
return func1().or(this::func2);
}
or
(введено в Java 9) делает именно то, что вы просили: Если Optional
, возвращенное из func1
, имеет значение, оно возвращается (или эквивалент Optional
). Если нет, поставщик (здесь func2()
) вызывается для получения Optional
, который затем возвращается.
Есть несколько способов. В Java 8 я предпочитаю брать значения из Optional
из func1
и func2
:
Optional<String> myFunc() {
String returnValue = func1().orElse(func2().orElse(null));
return Optional.ofNullable(returnValue);
}
Правка 2: Альтернативное предложение @ Хольгера в комментарии достаточно для цитирования в ответе (Хольгер, вы, возможно, разместили его в качестве комментария только потому, что вопрос закрыт, и поэтому вы не можете опубликовать свой собственный ответ):
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
, использованный в нескольких других ответах, настолько низкоуровневый, что я редко использую его и только как последнее средство.