哪种null检查更可取?
Optional.ofNullable(port).ifPresent(settings::setPort);
或
if (port != null) {
settings.setPort(port);
}
答案 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
的实际功效是以下方法:
Optional::filter(Predicate<? super T> predicate)
将过滤器应用于 present 值。Optional::map(Function<? super T,? extends U> mapper)
将映射功能应用于 present 值。 例如,假设您要从port
获取另一个值以添加到列表中,并且如果port
为null
,则避免使用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()