如果在布尔值上则为其他函数

时间:2018-08-20 14:00:14

标签: java java-8 optional

如果不是布尔值,我想做一个非常基础的事情。我缺少了一些我认为很基本​​的东西

所以,如果不是这样的话,老派就这样

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

我尝试了两次替换

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

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

似乎不太了解语法吗?

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:5)

map不起作用,因为method1method2都没有返回值。并且不允许映射到void

当前Java 8中没有真正的整洁解决方案,但是如果您碰巧使用Java 9,则可以通过ifPresentOrElse(Consumer<T>, Runnable>)来实现:

filterValue.ifPresentOrElse(value -> {
    if(value){
        method1();
    } else {
        method2();
    }
}, () -> method3());

答案 1 :(得分:2)

这会将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();
但是您没有处于这种配置中:您想根据Optional的3个不同状态调用一个不同的方法:存在和真实,存在和错误,不存在。
Optional不提供执行这种逻辑的直接方法。


通过降低嵌套级别,您的代码可能更具可读性:

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

答案 2 :(得分:2)

尽管,这实际上并不是您使用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");
  }
}