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

What's the difference between Objects.requireNonNullElse() and Optional.ofNullable().orElse()?

Java 9 将requireNonNullElserequireNonNullElseGet方法引入Objectsclass。这些在功能上与 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() 要求其中一个参数为非空,否则将抛出 NullPointerException

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

在他们的文档中解释了选择一个而不是另一个之间的概念差异。它依赖于 API 消费者的方法来选择他们应该有效使用其中的哪一个。

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

A variable whose type is Optional should never itself be null; it should always point to an Optional instance.

This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.

  • ofNullable

    returns 如果指定值不为空,则 Optional 具有现值,否则 Optional

  • orElse

    returns 值(如果存在)否则,returns 其他.

因此出现以下行为:

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 是一个 class 由用于操作的静态实用程序方法组成 对象,或在操作前检查某些条件。

These utilities include null-safe or null-tolerant methods for computing the hash code of an object, returning a string for an object, comparing two objects, and checking if indexes or sub-range values are out-of-bounds.

  • requireNonNullElse

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

因此行为不同:

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 - if both obj is null and defaultObj is null