【发布时间】:2014-07-09 11:53:50
【问题描述】:
在 Java 8 中,如果 Optional 对象存在,我想对它做一些事情,如果它不存在,我想做另一件事。
if (opt.isPresent()) {
System.out.println("found");
} else {
System.out.println("Not found");
}
不过,这不是“功能风格”。
Optional 有一个 ifPresent() 方法,但我无法链接 orElse() 方法。
因此,我不能写:
opt.ifPresent( x -> System.out.println("found " + x))
.orElse( System.out.println("NOT FOUND"));
在回复@assylias 时,我认为Optional.map() 不适用于以下情况:
opt.map( o -> {
System.out.println("while opt is present...");
o.setProperty(xxx);
dao.update(o);
return null;
}).orElseGet( () -> {
System.out.println("create new obj");
dao.save(new obj);
return null;
});
在这种情况下,当opt 存在时,我会更新其属性并保存到数据库中。当它不可用时,我创建一个新的obj 并保存到数据库中。
注意在两个 lambda 表达式中我必须返回 null。
但是当 opt 存在时,两个 lambdas 都会被执行。 obj 将被更新,一个新对象将被保存到数据库中。这是因为第一个 lambda 中的 return null。而orElseGet() 会继续执行。
【问题讨论】:
-
使用您的第一个样本。它是美丽的。
-
我建议您在使用不是为该行为设计的 API 时停止强制执行某些行为。你的第一个例子对我来说看起来不错,除了一些小风格的评论,但那些都是自以为是的。
-
@smallufo:将
return null;替换为return o;(两者)。但是,我有强烈的感觉,你在错误的地方工作。您应该在产生该Optional的站点工作。在那个地方应该有一种方法可以在没有中间Optional的情况下执行所需的操作。 -
Java 9 为您的问题实现了解决方案:iteratrlearning.com/java9/2016/09/05/java9-optional.html
-
我认为这不能轻易完成的原因是故意的。 Optional 不应该做流量控制,而是价值转换。我知道
ifPresent与此相矛盾。所有其他方法都引用值而不是操作。
标签: java functional-programming java-8 optional