Java 9将requireNonNullElse
和requireNonNullElseGet
方法引入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
?
答案 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
返回带有当前值的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方法 计算对象的哈希码,返回一个字符串 对象,比较两个对象,并检查索引或子范围 价值超出界限。
如果 它是非空的,则返回第一个参数,否则 第二个参数 如果它是非空的
因此行为上的差异:
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