java 9向Objects
类引入requireNonNullElse
和requireNonNullElseGet
方法。这些在功能上与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