Objects.requireNonNullElse() 和 Optional.ofNullable().orElse() 有什么区别?



java 9向Objects类引入requireNonNullElserequireNonNullElseGet方法。这些在功能上与Optional.ofNullable() orElse()orElseGet()方法有什么不同吗?

String foo = null;
Objects.requireNonNullElse(foo, "nonNull");//returns the string "nonNull"
Optional.ofNullable(foo).orElse("nonNull");//also returns the string "nonNull"

如果它们没有功能差异,为什么现在添加了Objects

其行为有一个较小的差异。Objects.requireNonNullElse()要求其中一个参数是非null,否则将抛出NullPointerException

String foo = null, bar = null;
Optional.ofNullable(foo).orElse(bar); //returns a null value
Objects.requireNonNullElse(foo, bar); //throws a NullPointerException

在其文档中所解释的那样,选择一个选择彼此之间的概念差异。它依靠API消费者的方法选择其中的方法应该有效地使用。

Optional 是容器对象,可能包含或可能不包含非零值。

类型为 Optional的变量永远不要是 null;它 应始终指向Optional实例。

这是一个基于价值的类;使用对身份敏感的操作 (包括参考平等(==),身份哈希代码或 同步)在可选的实例上可能具有不可预测的 结果并应避免。

  • ofNullable

    如果指定的值不为null,则返回具有现值的Optional,否则空的Optional

  • orElse

    如果存在否则返回值,否则,返回其他

因此,以下行为:

String foo = null;
=> Optional.ofNullable(foo).orElse("nonNull")
=> Optional.ofNullable(null).orElse("nonNull")
=> Optional.empty().orElse("nonNull")
=> return otherwise "nonNull"

与遍历

相同
String foo = null, bar = null;
=> Optional.ofNullable(foo).orElse(bar);
=> Optional.ofNullable(null).orElse(bar);
=> Optional.empty().orElse(bar)
=> return otherwise 'bar'
=> returns null

Objects 是一类,包括用于操作的静态实用方法 对象,或在操作之前检查某些条件。

这些公用事业包括null-safe或null耐受性方法 计算对象的哈希代码,返回一个字符串 对象,比较两个对象,并检查索引或子范围是 值是距离的。

  • requireNonNullElse

    如果它是非null,则返回第一个参数strong>

因此,行为的差异:

String foo = null;
=> Objects.requireNonNullElse(foo, "nonNull")
=> Objects.requireNonNullElse(null, "nonNull");

如果requireNonNull("nonNull", "defaultObj"),则进一步评估

=> returns "nonNull" since its a non-null value

现在遍历

String foo = null, bar = null;
=> Objects.requireNonNullElse(foo, bar);
=> Objects.requireNonNullElse(null, bar);

它在内部检查 requireNonNull(bar, "defaultObj")是否

=> throws a NullPointerException

也记录了

throws NullPointerException-如果两个OBJ都是null defaultObj 是null

最新更新