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

标签 java lambda java-8 null option-type

哪种空检查更可取?

Optional.ofNullable(port).ifPresent(settings::setPort);

if (port != null) {
   settings.setPort(port);
}

最佳答案

在 Java 中,Optional 值是指示存在或不存在的位与任意引用类型 T 或原始 的值的融合intlongdouble

当从方法返回值时,融合它们特别有用,因为方法只有一个返回值。通常需要使用一个特殊的值,例如在引用类型的情况下使用 null,或者在 int 的情况下使用 -1,作为指示“无-值”的情况。使用 Optional 作为返回值可以避免调用者不小心误用 sentinel 值作为真正的返回值的问题。

鉴于此,代码行如

Optional.ofNullable(port).ifPresent(settings::setPort);

的奇怪之处在于它在该行的第一部分将一个值与存在/不存在的位融合,然后立即在该行的第二部分将它们分开。这给原本相当简单的任务增加了复杂性:检查 port 是否为非空并有条件地执行某些操作。替代代码片段:

if (port != null) {
    settings.setPort(port);
}

非常清楚地准确表达了它的作用。

的确,if 语句比 Optional 链占用更多的垂直空间。 Optional 链更密集,但也更难理解:一个糟糕的权衡。

关于java - Optional.ofNullable() 是否应该用于空检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52038417/

相关文章:

java - 拆分数组列表并再次将它们合并回来

c++ - 用 lambda 初始化 std::unique_ptr 的 std::vector

c# - 如何按字典值对对象列表进行排序?

Java-8 流 - 将子类型列表转换为父类(super class)型列表

java - Spring中每个方法执行前如何调用自定义验证

java - 如何将图像序列转换为 QuickTime 影片?

java - 从 Groovy 类创建 Spring bean 导致 "cannot find symbol error"

java - 删除Java中的所有空文件夹

C++0x lambda 与 #define

javafx - 将 AnchorPanes 添加到 ScrollPanes Javafx 8