现代 Java 版本应该使用什么“第一个非空”方法?

问题描述 投票:0回答:1

在 Java 8 中,我们一直在使用 Guava 的

MoreObjects.firstNonNull()
,有时还使用 Apache Commons Lang 3
ObjectUtils.firstNonNull()
。现在,Java 9 引入了
Objects.requireNonNullElse()
方法。这些方法如何相互关联?
Objects.requireNonNullElse()
是否可以直接替代这些其他方法?

(类似的问题,但我要发布的答案并不完全相同:如何在Java中获取第一个非空值?

java java-9 java-17 java-21
1个回答
0
投票

(如果您想跳到摘要,请参阅最后的 TL;DR)

番石榴
MoreObjects.firstNonNull(T, T)

Guava 的

MoreObjects.firstNonNull(T, T)
是这样描述的。重要的部分是
@throws NullPointerException if both {@code first} and {@code second} are null
。此方法要求其中任何一个对象都是非空的

Apache Commons Lang 3
ObjectUtils.firstNonNull()
defaultIfNull(T, T)

另一方面,

ObjectUtils.firstNonNull(T...)
对空值的处理更加“宽松”。如果所有值都为 null,那么该方法将简单地返回
null
。对于某些情况,这可能更好(只要调用代码正确处理
null
返回值)。

另请注意,这需要一个

T...
可变参数,因此它可以与两个以上的参数一起使用,与其他选项不同。

ObjectUtils.defaultIfNull(T, T)
方法也存在,并且具有类似的
null
语义,但针对二参数场景稍微优化了一些。

JDK
java.util.Objects.requireNonNullElse
requireNonNullElseGet
方法

Objects.requireNonNullElse(T, T)
具有以下语义。它与 Guava
MoreObjects.firstNonNull()
方法非常接近,它应该是该方法的直接替代品。

最后是

Objects.requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
方法。如果创建后备值是一项较繁重的操作,而您希望在
obj
为非
null
时避免这种操作,那么它会很有用。

TL;博士

  • 如果没有一个参数可以是
    null
    ,则使用
    Objects.requireNonNullElse(T, T)
  • 如果其中一个参数可以是
    null
    并且 Apache Commons Lang 3 是可接受的依赖项,请使用
    ObjectUtils.defaultIfNull(T, T)
  • 如果您使用两个以上参数并且 Apache Commons Lang 3 没问题,请使用
    ObjectUtils.firstNonNull(T...)
    ,但请注意
    null
    值可能会使用此方法偷偷溜过。您可能希望将结果包装在
    Objects.requireNonNullElse()
    调用或其他一些
    null
    保护中,以避免运行时出现 NPE。
© www.soinside.com 2019 - 2024. All rights reserved.