Возвратите Optional как есть, если возвращаемый Optional имеет значение, иначе вызовите другую функцию [duplicate]

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

Конечная переменная, после инициализации значения не может быть изменена. Конечная статическая переменная используется для создания постоянной (неизменяемой) и ссылки непосредственно без использования объекта.

5
задан Ole V.V. 18 January 2019 в 10:15
поделиться

4 ответа

Было бы что-то вроде этого, если бы я все правильно понял:

Optional.of(obj1)
        .filter(obj -> func1().isPresent())
        .orElse(func2());
0
ответ дан Artur Vakhrameev 18 January 2019 в 10:15
поделиться

Если вы используете Java 9+ , вы можете просто использовать Optional.or:

return func1().or(() -> func2());

В Java 8 , вам может понадобиться создать новый Опциональный из результатов (используйте orElseGet, чтобы избежать нетерпеливого выполнения):

return Optional.ofNullable(func1().orElseGet(() -> func2().orElse(null)));
0
ответ дан ernest_k 18 January 2019 в 10:15
поделиться

Вот более общая версия, работающая с 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());
}

.

0
ответ дан Benoit 18 January 2019 в 10:15
поделиться

Редактировать: or

Java 9 и более поздние версии предлагают очень элегантное решение:

Optional<String> myFunc() {
    return func1().or(this::func2);
}

or (введено в Java 9) делает именно то, что вы просили: Если Optional, возвращенное из func1, имеет значение, оно возвращается (или эквивалент Optional). Если нет, поставщик (здесь func2()) вызывается для получения Optional, который затем возвращается.

Java 8

Есть несколько способов. В 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, использованный в нескольких других ответах, настолько низкоуровневый, что я редко использую его и только как последнее средство.

0
ответ дан Ole V.V. 18 January 2019 в 10:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: