3 回答
TA贡献1891条经验 获得超3个赞
map不起作用,因为既没有method1也method2没有返回值。并且void不允许映射到。
目前在 Java 8 中没有真正巧妙的解决方案,但如果您碰巧使用 Java 9,您可以通过ifPresentOrElse(Consumer<T>, Runnable>)以下方式实现:
filterValue.ifPresentOrElse(value -> {
if(value){
method1();
} else {
method2();
}
}, () -> method3());
TA贡献1815条经验 获得超13个赞
这将映射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();
}
添加回答
举报