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

2022-09-04 06:29:48

哪种空检查更可取?

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

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

答案 1

在 Java 中,值是指示存在或不存在的位的融合,其值为任意引用类型或基元 、 、 或 。OptionalTintlongdouble

当从方法返回值时,这些元素融合特别有用,因为方法只有一个返回值。通常需要使用特殊值(例如在引用类型的情况下)或 -1 作为哨兵来指示“无值”情况。用作返回值可避免调用方意外误用 sentinel 值作为实际返回值的问题。nullintOptional

鉴于此,代码行如

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

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

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

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

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


答案 2

虽然,您在问题中发布的代码段只是避免丑陋的简单方法,但又有效,正确且无效。在这种情况下,请遵循您的个人偏好。null-check

Optional 的真正威力在于以下方法:

例如,假设您希望从中获取另一个值以添加到列表中,如果为:则避免NPE:portportnull

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

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

if (Optional.ofNullable(port).isPresent()) {
    settings.setPort(port);
}