如果不是布尔值,我想做一个非常基础的事情。我缺少了一些我认为很基本的东西
所以,如果不是这样的话,老派就这样
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());
似乎不太了解语法吗?
有人能指出我正确的方向吗?
答案 0 :(得分:5)
map
不起作用,因为method1
和method2
都没有返回值。并且不允许映射到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");
}
}