Optional.ofNullable()是否应该用于空检查?

app*_*ice 5 java null lambda optional java-8

哪种空检更好?

Optional.ofNullable(port).ifPresent(settings::setPort);
Run Code Online (Sandbox Code Playgroud)

要么

if (port != null) {
   settings.setPort(port);
}
Run Code Online (Sandbox Code Playgroud)

Stu*_*rks 6

在Java中,一个Optional值是一个位的融合,其指示存在或不存在,与任意参考类型的值T或原始int,longdouble.

从方法返回值时,融合这些特别有用,因为方法只有一个返回值.通常需要使用特殊值,例如null在引用类型的情况下,或者在-1的情况下使用-1 int作为表示"无值"情况的标记.使用Optional作为返回值避免了调用者意外地将sentinel值误用为实际返回值的问题.

鉴于此,代码行如

Optional.ofNullable(port).ifPresent(settings::setPort);
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它将一个值与行的第一部分中的当前/不存在位融合,然后立即在行的第二部分中将它们分开.这增加了最终相当简单的任务的复杂性:检查是否port为非null并有条件地执行某些操作.替代代码段:

if (port != null) {
    settings.setPort(port);
}
Run Code Online (Sandbox Code Playgroud)

很清楚地表达了它的作用.

确实,if语句占用了比Optional链更多的垂直空间.该Optional链是密集的,但它也很难理解:一个贫穷的权衡.


Nik*_*las 5

虽然,您在问题中发布的代码段只是一种避免丑陋的简单方法null-check,但它是有效、正确和空安全的。在这种情况下,请遵循您的个人喜好。

的真正威力Optional是以下方法:

例如,假设您想从中获取另一个值port以添加到列表中并避免 NPE,如果portnull

Optional.ofNullable(port).map(port::getSomeValue).ifPresent(settings::setPort);
Run Code Online (Sandbox Code Playgroud)

此外,请避免null-check我经常看到的以下无意义的替换:

if (Optional.ofNullable(port).isPresent()) {
    settings.setPort(port);
}
Run Code Online (Sandbox Code Playgroud)

  • `.map(Port::getSomeValue)` 以保持简单。你真的经常看到最后一点吗?真是可悲! (3认同)