在 Java 8 中,我们一直在使用 Guava 的
MoreObjects.firstNonNull()
,有时还使用 Apache Commons Lang 3 ObjectUtils.firstNonNull()
。现在,Java 9 引入了 Objects.requireNonNullElse()
方法。这些方法如何相互关联?Objects.requireNonNullElse()
是否可以直接替代这些其他方法?
(类似的问题,但我要发布的答案并不完全相同:如何在Java中获取第一个非空值?)
(如果您想跳到摘要,请参阅最后的 TL;DR)
MoreObjects.firstNonNull(T, T)
MoreObjects.firstNonNull(T, T)
是这样描述的。重要的部分是@throws NullPointerException if both {@code first} and {@code second} are null
。此方法要求其中任何一个对象都是非空的
ObjectUtils.firstNonNull()
和 defaultIfNull(T, T)
ObjectUtils.firstNonNull(T...)
对空值的处理更加“宽松”。如果所有值都为 null,那么该方法将简单地返回 null
。对于某些情况,这可能更好(只要调用代码正确处理 null
返回值)。
另请注意,这需要一个
T...
可变参数,因此它可以与两个以上的参数一起使用,与其他选项不同。
ObjectUtils.defaultIfNull(T, T)
方法也存在,并且具有类似的null
语义,但针对二参数场景稍微优化了一些。
java.util.Objects.requireNonNullElse
和 requireNonNullElseGet
方法Objects.requireNonNullElse(T, T)
具有以下语义。它与 Guava MoreObjects.firstNonNull()
方法非常接近,它应该是该方法的直接替代品。
Objects.requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
方法。如果创建后备值是一项较繁重的操作,而您希望在 obj
为非 null
时避免这种操作,那么它会很有用。
null
,则使用 Objects.requireNonNullElse(T, T)
null
并且 Apache Commons Lang 3 是可接受的依赖项,请使用 ObjectUtils.defaultIfNull(T, T)
ObjectUtils.firstNonNull(T...)
,但请注意,null
值可能会使用此方法偷偷溜过。您可能希望将结果包装在 Objects.requireNonNullElse()
调用或其他一些 null
保护中,以避免运行时出现 NPE。