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

时间:2017-10-02 03:13:27

标签: java null optional nullable java-9

Java 9将requireNonNullElserequireNonNullElseGet方法引入Objects类。这些功能与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

2 个答案:

答案 0 :(得分:6)

他们的行为有一个细微的差别。 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

答案 1 :(得分:2)

选择一个与另一个之间的概念差异如其文档中所述。它依赖于API使用者的方法来选择它们中的哪一个应该被它们有效地使用。

Optional 是容器对象,可能包含也可能不包含非空值。

  

类型为Optional的变量本身不应为null;它   应始终指向Optional实例。

     

这是一个基于价值的课程;使用身份敏感操作   (包括引用相等(==),标识哈希码或   可选的实例可能具有不可预测性   结果,应该避免。

  • <强> ofNullable

    如果指定的值为非null,则

    返回带有当前值的Optional,否则返回 empty 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-tolerant方法   计算对象的哈希码,返回一个字符串   对象,比较两个对象,并检查索引或子范围   价值超出界限。

  • <强> requireNonNullElse

    如果 它是非空的,则返回第一个参数,否则 第二个参数 如果它是非空的

因此行为上的差异:

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