【发布时间】:2017-07-17 20:44:30
【问题描述】:
java.util.Objects 类扩展了许多新方法
分别
Objects#requireNonNullElseGet() 在Java-9。
如果第一个参数不为空,则两者都将返回,否则返回非空的第二个参数或supplier.get()的非空值
jshell> String nullStr = null;
nullStr ==> null
jshell> Objects.requireNonNullElse(nullStr,"lorem ipsum");
$13 ==> "lorem ipsum"
jshell> Objects.requireNonNullElseGet(nullStr,() -> "lorem ipsum");
$14 ==> "lorem ipsum"
但新功能与Optional 类Optional#orElse 和Optional#orElseGet 中已有的功能重叠
jshell> Optional.ofNullable(nullStr).orElse("lorem ipsum");
$17 ==> "lorem ipsum"
jshell> Optional.ofNullable(nullStr).orElseGet(() -> "lorem ipsum");
$18 ==> "lorem ipsum"
Objects 中的新方法与对应的Optional 方法之间的唯一区别是供应商的第二个参数或值必须为非空,否则Objects 会抛出NPE:
jshell> Objects.requireNonNullElseGet(nullStr,() -> null);
| java.lang.NullPointerException thrown: supplier.get()
| at Objects.requireNonNull (Objects.java:246)
| at Objects.requireNonNullElseGet (Objects.java:321)
| at (#15:1)
jshell> Objects.requireNonNullElse(nullStr,null);
| java.lang.NullPointerException thrown: defaultObj
| at Objects.requireNonNull (Objects.java:246)
| at Objects.requireNonNullElse (Objects.java:301)
| at (#16:1)
相对于Optional
jshell> Optional.ofNullable(nullStr).orElse(null);
$19 ==> null
jshell> Optional.ofNullable(nullStr).orElseGet(() -> null);
$20 ==> null
- 为什么 JDK 开发人员没有更新 Optional 中的现有方法 班级?
- 他们为什么不引入一个新方法(会抛出 NPE 如果第二个参数为空)到可选类?
- 我们现在应该使用什么 Optional 或 Objects?
- 新方法是否使 Objects 比 Optional 更可取,因为它们 将立即抛出 NPE,而不是稍后在代码中的某个地方 喜欢 Optional?
如果我有旧代码,例如:
String str = null;
String result = str == null ? "other string" : str;
这只是一个方法内部的简单检查。而且我想使用最新的语言功能对其进行重构。现在考虑Optional.orElse 和Objects.requireNonNullOrElse 之间的区别,哪个更可取?
result = Optional.ofNullable(str).orElse("other string");
或
result = Objects.requireNonNullOrElse(str,"other string);
【问题讨论】: