java.util.Objects 类在 Java 9 中新增了一些方法。
Objects#requireNonNullElse 方法和 Objects#requireNonNullElseGet() 方法分别实现了以下功能:
如果第一个参数非空,则返回该参数;否则返回第二个非空参数或 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类中现有的方法?
- 他们为什么没有引入一个新方法(如果第二个参数为null,将抛出NPE)到Optional类中?
- 现在应该使用Optional还是Objects?
- 新方法是否使得Objects比Optional更可取,因为它们会立即抛出NPE而不是像Optional那样在代码的其他地方稍后抛出?
如果我有一个遗留代码,就像这样:
String str = null;
String result = str == null ? "other string" : str;
这只是一个方法内部的简单检查。我想使用最新的语言功能进行重构。现在考虑到 Optional.orElse
和 Objects.requireNonNullElse
之间的区别,哪个更可取?
result = Optional.ofNullable(str).orElse("other string");
或者result = Objects.requireNonNullOrElse(str,"other string);
Optional
的方式不正确。我曾认为它们可以用作if-null-check
的替代方案。现在我将重新审查我的方法。非常感谢。 - Anton Balaniuc