当前位置: 首页 > 知识库问答 >
问题:

java.util.Objects与Optional哪个更好?

雷方伟
2023-03-14

java.util.Objects类使用了许多新方法进行了扩展

对象#RequireNonNullElse

分别

java-9中的对象#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类中已存在的可选#orelse和可选#orelseget重叠

jshell> Optional.ofNullable(nullStr).orElse("lorem ipsum");
$17 ==> "lorem ipsum"

jshell> Optional.ofNullable(nullStr).orElseGet(() -> "lorem ipsum");
$18 ==> "lorem ipsum"

objects中的新方法与相应的optional方法之间的唯一区别是,supplier的第二个参数或值必须是非空的,否则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)

相对于可选

jshell> Optional.ofNullable(nullStr).orElse(null);
$19 ==> null

jshell> Optional.ofNullable(nullStr).orElseGet(() -> null);
$20 ==> null
  • 为什么JDK开发人员没有更新可选类中的现有方法?
  • 为什么他们没有向可选类引入一个新方法(如果第二个参数为null,该方法将抛出NPE)?
  • 现在应该使用什么可选或对象?
  • 新方法是否使对象比可选对象更可取,因为它们将立即抛出NPE,而不是稍后在代码中的某个位置抛出NPE,就像可选对象一样?

如果我有一个遗留代码,类似于:

String str = null; 
String result = str == null ? "other string" : str;

这只是方法内部的一个简单检查。我想用最新的语言特性重新调整它。现在,考虑到optional.orelseobjects.requirenonnullorelse之间的区别,哪个更好?

result = Optional.ofNullable(str).orElse("other string");

result = Objects.requireNonNullOrElse(str,"other string);

暂时还没有答案

 类似资料:
  • 问题内容: 我一直在阅读和学习有关Docker的知识,并试图正确选择要使用的Django设置。到目前为止,有: Docker Compose 或Dockerfile 我了解在中使用了,但是我不确定是否将所有内容放入一个大的Dockerfile中并用多个命令处理不同的映像是否是一个好习惯? 我想使用几个不同的图像,包括: 请提供关于使用 Docker 设置此类环境的最佳实践的建议。 如果有帮助,我在

  • 问题内容: 我知道它们本质上是同一件事,但是就样式而言,哪个是创建空列表或字典的更好(更Pythonic的)? 问题答案: 在速度方面,空列表/字典没有竞争: 对于非空: 另外,使用方括号表示法还可以使您使用列表和字典理解,这可能就足够了。

  • 问题内容: 我已经阅读了很多有关每种方法的优缺点的信息,并且我知道委托通常是针对一个侦听器的,而通知则针对许多侦听器。问题在于性能。 我正在通过通知将麦克风的音频信号发送到另一个班级。我知道在这里我应该使用委托,但我的问题是:委托会更快吗?因为我可以看到我有一些帧速率问题(已减少),并且我想知道原因是否可能是使用通知 而不是 委托,还是没有关系? 问题答案: 代表的开销较少,因此执行速度更快。 但

  • 问题内容: 我仔细研究了它,它看起来非常高效,尤其是对于值小于64的枚举。 基本上,所有集合共享所有可能的枚举值的单个数组,而唯一的另一条信息是位掩码,如果设置为一,则将其设置为。 另一方面,Enum.values()似乎有点黑魔法。此外,它返回一个数组,而不是一个集合,因此在许多情况下,必须用Arrays.asList()装饰它,以便在任何需要集合的地方使用。 那么,应该更可取吗? 更具体地说,

  • 我想知道,以下两种方法中哪一种是声明字典的最佳实践,为什么?

  • 问题内容: 使用哪种更好或更方便: 要么 问题答案: 您是否完全需要类型属性?如果您使用的是HTML5,则不会。否则,是的。HTML 4.01和XHTML 1.0 根据需要指定属性,而HTML5具有可选属性,默认为。HTML5现在得到了广泛的实现,因此,如果您使用HTML5doctype,则是有效且不错的选择。 至于type属性中应该包含的内容,2006年注册的MIME类型旨在替代所有主要浏览器(