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

时间:2018-08-27 11:34:38

标签: java lambda java-8 null optional

哪种null检查更可取?

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

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

3 个答案:

答案 0 :(得分:6)

在Java中,Optional值是指示存在或不存在的位与任意引用类型T或原始int,{{1 }}或long

当从方法返回值时,将它们融合起来特别有用,因为方法只有一个返回值。对于引用类型,通常需要使用特殊值,例如double,对于null,则必须使用-1作为标记,以指示“无值”情况。使用int作为返回值可以避免呼叫者意外将哨兵值误用作实际返回值的问题。

给出这样的代码行,例如

Optional

的奇怪之处在于,它在行的第一部分中将值与当前/不存在的位融合在一起,然后立即在行的第二部分中将它们分开。这使最终是相当简单的任务变得更加复杂:检查Optional.ofNullable(port).ifPresent(settings::setPort); 是否为非null并有条件地执行某些操作。备用代码段:

port

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

的确,if语句比if (port != null) { settings.setPort(port); } 链需要更多的垂直空间。 Optional链比较密集,但也很难理解:权衡取舍。

答案 1 :(得分:3)

尽管,您在问题中发布的代码段只是避免丑陋的null-check的简单方法,但却是有效,正确且可以空值的。在这种情况下,请遵循您的个人喜好。

Optional的实际功效是以下方法:

例如,假设您要从port获取另一个值以添加到列表中,并且如果portnull,则避免使用NPE:

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

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

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

答案 2 :(得分:2)

何时使用它取决于几个因素。 如果port是类中的一个属性,则可能使用Optional有点过分。 (并且不要将not serializbie用作属性Optional

例如,在编写库时,我认为Optional很棒。

public Optional<Integer> getPort()

对其他开发人员而言,描述性要强得多

// Returns null if not set
public Integer getPort()
相关问题