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

Dav*_*ica 5 java null nullable optional 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"
Run Code Online (Sandbox Code Playgroud)

如果他们没有功能差异,为什么Objects现在添加一个?

Dav*_*ica 6

他们的行为有一个细微的差别.Objects.requireNonNullElse()要求其中一个参数为非null,否则NullPointerException抛出a.

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

  • 还有一个小的非功能性差异,`Optional`版本生成垃圾*(除非JIT足够聪明,可以优化它)*. (3认同)
  • @Andreas JMH报告`Optional.ofNullable().orElse()`和`Objects.requireNonNullElse()之间没有分配区别. (3认同)

Nam*_*man 5

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

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

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

这是一门以价值观为基础的课程;在Optional实例上使用身份敏感操作(包括引用相等(==)、身份哈希码或同步)可能会产生不可预测的结果,应避免。

  • ofNullable

    Optional如果指定值非空,则返回当前值,否则返回Optional

  • orElse

    如果存在则返回该值,否则返回 other

因此出现以下行为:

String foo = null;
=> Optional.ofNullable(foo).orElse("nonNull")
=> Optional.ofNullable(null).orElse("nonNull")
=> Optional.empty().orElse("nonNull")
=> return otherwise "nonNull"
Run Code Online (Sandbox Code Playgroud)

和它遍历的一样

String foo = null, bar = null;
=> Optional.ofNullable(foo).orElse(bar);
=> Optional.ofNullable(null).orElse(bar);
=> Optional.empty().orElse(bar)
=> return otherwise 'bar'
=> returns null
Run Code Online (Sandbox Code Playgroud)

Objects 是一个由静态实用方法组成的类,用于对对象进行操作,或在操作之前检查某些条件。

这些实用程序包括空安全或空容忍方法,用于计算对象的哈希码、返回对象的字符串、比较两个对象以及检查索引或子范围值是否越界。

  • requireNonNullElse

    如果第一个参数非空,则返回;否则,如果第二个参数非空,则返回

因此行为上的差异:

String foo = null;
=> Objects.requireNonNullElse(foo, "nonNull")
=> Objects.requireNonNullElse(null, "nonNull");
Run Code Online (Sandbox Code Playgroud)

进一步内部评估 ifrequireNonNull("nonNull", "defaultObj")和 then

=> returns "nonNull" since its a non-null value
Run Code Online (Sandbox Code Playgroud)

现在当它穿过

String foo = null, bar = null;
=> Objects.requireNonNullElse(foo, bar);
=> Objects.requireNonNullElse(null, bar);
Run Code Online (Sandbox Code Playgroud)

它在内部检查 if requireNonNull(bar, "defaultObj")which then

=> throws a NullPointerException
Run Code Online (Sandbox Code Playgroud)

正如记录的那样

throws NullPointerException- 如果 objnull defaultObj 都为null