Objects.requireNonNullElse() 和 Optional.ofNullable().orElse() 有什么区别?
What's the difference between Objects.requireNonNullElse() and Optional.ofNullable().orElse()?
Java 9 将requireNonNullElse
和requireNonNullElseGet
方法引入Objects
class。这些在功能上与 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.
-
returns 如果指定值不为空,则 Optional
具有现值,否则 空 Optional
-
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.
-
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
Java 9 将requireNonNullElse
和requireNonNullElseGet
方法引入Objects
class。这些在功能上与 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 benull
; it should always point to anOptional
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.
-
returns 如果指定值不为空,则
Optional
具有现值,否则 空Optional
-
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.
-
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 isnull
and defaultObj isnull