Java9将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
?
发布于 2017-10-02 03:13:26
他们的行为有一个细微的差别。Objects.requireNonNullElse()
要求其中一个参数为非空参数,否则将引发NullPointerException
。
String foo = null, bar = null;
Optional.ofNullable(foo).orElse(bar); //returns a null value
Objects.requireNonNullElse(foo, bar); //throws a NullPointerException
发布于 2017-10-02 03:46:14
概念上的区别是选择一个而不是另一个,正如他们的文档所解释的那样。它依赖于API使用者的方法来选择其中的哪一个应该被他们有效地使用。
Optional是容器对象,它可能包含也可能不包含非空值。
一个类型为
Optional
的变量,它本身不应该是null
**;,它应该始终指向**Optional
实例. 这是一个基于值的类;对可选实例使用标识敏感操作(包括引用相等(==)、标识哈希代码或同步)可能会产生不可预测的结果,因此应该避免。
Optional
,否则为空Optional
。因此,出现了以下行为:
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 是一个由静态实用程序方法组成的类,用于在对象上操作,或者在操作之前检查某些条件。
这些实用工具包括空安全或空容忍方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。
因此,行为上的差异:
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
https://stackoverflow.com/questions/46519014
复制相似问题