Я ищу, чтобы сделать очень простой, если еще на булево необязательное значение. Я скучаю по чему-то очень простому, я думаю

Так что старая школа, если еще гнездо так

    if (filterValue.isPresent()) {
        if (filterValue.get()==true) {
            method1();
        } else {
            method2();
        }
    } else {
        method3();
    }

Я пробовал различные попытки на 2 замены

filterValue.map(o -> o.TRUE ? method1() : method2()).orElse(method3());

А также

filterValue.isPresent(filterValue.get().TRUE ? method1() : method2());

И не могу понять синтаксис?

Может ли кто-нибудь указать мне правильное направление?

3
gringogordo 20 Авг 2018 в 17:00

3 ответа

Лучший ответ

map не работает, потому что ни method1, ни method2 не имеют возвращаемого значения. И сопоставление с void не допускается.

В настоящее время в Java 8 нет настоящего аккуратного решения, но если вы используете Java 9, вы достигнете его с помощью ifPresentOrElse(Consumer<T>, Runnable>):

filterValue.ifPresentOrElse(value -> {
    if(value){
        method1();
    } else {
        method2();
    }
}, () -> method3());
5
Lino 20 Авг 2018 в 14:10

Это отображает Optional на возвращаемое значение методов:

filterValue.map(o -> o.TRUE ? method1() : method2()).orElse(method3());

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

Хотя это не может быть скомпилировано, поскольку isPresent() не принимает никаких параметров, но возвращает boolean:

filterValue.isPresent(filterValue.get().TRUE ? method1() : method2());

Путь старой школы - это то, что вам нужно.
Optional был введен для предотвращения NullPointerException.
А в некоторых конкретных случаях, когда вы хотите отобразить Optional на другое, он избавит вас от условных операторов: Foo foo = Optional.map(..).map(...).get();.
Но вы не в этой конфигурации: вы хотите вызвать отдельный метод в соответствии с 3 различными состояниями Optional: настоящее и истинное, настоящее и ложное, отсутствующее.
Optional не предоставляют прямых методов для выполнения такой логики.


Ваш код может быть более читабельным за счет снижения уровня вложенности:

if (filterValue.isPresent() && filterValue.get()) {
    method1();
} else if (filterValue.isPresent()) {
    method2();
} else {
    method3();
}
2
davidxxx 20 Авг 2018 в 15:05

Хотя это не совсем то, как вы используете Optionals, вы можете попробовать это так:

import java.util.Optional;

public class Test {

  public static void main(String[] args) {
    final Optional<Boolean> filterValue = Optional.of(true);
    // final Optional<Boolean> filterValue = Optional.of(false);
    // final Optional<Boolean> filterValue = Optional.empty(); // thx @Holger

    Runnable methodToCall = filterValue
        .map(b -> b ? (Runnable) Test::method1 : (Runnable) Test::method2)
        .orElse(Test::method3);

    methodToCall.run();
  }

  private static void method1() {
    System.out.println("Method1");
  }

  private static void method2() {
    System.out.println("Method2");
  }

  private static void method3() {
    System.out.println("Method3");
  }
}
2
ifloop 20 Авг 2018 в 14:26
51932411