Java “如何替换”;返回optObj.isPresent()?新Obj2(optObj):空;功能性风格?

Java “如何替换”;返回optObj.isPresent()?新Obj2(optObj):空;功能性风格?,java,java-8,ide,optional,Java,Java 8,Ide,Optional,我的IDE(InteliJ)一直告诉我,我的代码“可以用函数式的单个表达式替换”,突出显示isPresent(): 时间戳初始化为可选: Optional<Date> timestamp = ... 可选时间戳=。。。 我的假设是我应该使用ifPresent。像这样timestamp.ifPresent(Obj2::new)。但是ifPresent无效,我没有机会返回创建的对象。也不能返回null。我的代码有什么解决方案吗?你说的是正确的,如果存在,则返回void,因此不适合这种

我的IDE(InteliJ)一直告诉我,我的代码“可以用函数式的单个表达式替换”,突出显示
isPresent()

时间戳
初始化为可选:

Optional<Date> timestamp = ...
可选时间戳=。。。

我的假设是我应该使用
ifPresent
。像这样
timestamp.ifPresent(Obj2::new)
。但是
ifPresent
无效,我没有机会返回创建的对象。也不能返回
null
。我的代码有什么解决方案吗?

你说的是正确的,如果存在,则返回void,因此不适合这种情况。您的IDE建议您只需执行以下操作:

timestamp.map(Obj2::new).orElse(null);
这表示为“如果可选的
时间戳
具有当前状态,则将其包含的对象传递到
Obj2
构造函数中,并返回此新的
Obj2
实例,否则(
orElse
)返回
null


另一方面,IntelliJ IDEA可以帮助您生成它所建议的代码

例如,给出以下屏幕截图:


我只需点击“突出显示”部分并按下“ALT+ENTER”,IntelliJ建议是否应该用功能样式替换条件。

此外,如
forEach()
ifPresent()
将消费者作为参数,因此它可以引入副作用。您通常会使用它来打印或记录内容。

请熟悉您的IDE。大多数IDE不仅会让您感到困扰:“嘿。。。你可以修复这个或简化那个”,他们通常也提供快速修复…你可能还想搜索“应用快速修复”;-)这是正确的,但我忍不住觉得IntelliJ标记它很愚蠢。“因为你可以”这本身并不是使用Optional方法的好理由。@VGR我完全同意你的观点,即“仅仅因为你可以并不意味着你必须”但我猜建议的好部分是“通常”“做事的惯用方式。例如,在屏幕截图中给出的示例中,我的想法是建议它是
person.orElse(null)
,在我看来这更好。
timestamp.map(Obj2::new).orElse(null);