首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Objects.requireNonNullElse()和Optional.ofNullable().orElse()有什么区别?

Objects.requireNonNullElse()和Optional.ofNullable().orElse()有什么区别?
EN

Stack Overflow用户
提问于 2017-10-02 03:13:26
回答 2查看 8.9K关注 0票数 13

Java9将requireNonNullElserequireNonNullElseGet方法引入到Objects类中。这些在功能上与Optional.ofNullable()orElse()orElseGet()方法有什么不同吗?

代码语言:javascript
运行
复制
String foo = null;
Objects.requireNonNullElse(foo, "nonNull");//returns the string "nonNull"
Optional.ofNullable(foo).orElse("nonNull");//also returns the string "nonNull"

如果它们没有功能上的差异,为什么现在添加了Objects

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-02 03:13:26

他们的行为有一个细微的差别。Objects.requireNonNullElse()要求其中一个参数为非空参数,否则将引发NullPointerException

代码语言:javascript
运行
复制
String foo = null, bar = null;
Optional.ofNullable(foo).orElse(bar); //returns a null value
Objects.requireNonNullElse(foo, bar); //throws a NullPointerException
票数 19
EN

Stack Overflow用户

发布于 2017-10-02 03:46:14

概念上的区别是选择一个而不是另一个,正如他们的文档所解释的那样。它依赖于API使用者的方法来选择其中的哪一个应该被他们有效地使用。

Optional是容器对象,它可能包含也可能不包含非空值。

一个类型为Optional 的变量,它本身不应该是null**;,它应该始终指向** Optional 实例. 这是一个基于值的类;对可选实例使用标识敏感操作(包括引用相等(==)、标识哈希代码或同步)可能会产生不可预测的结果,因此应该避免。

  • ofNullable 如果指定值为非空值,则返回具有现值的Optional,否则为空Optional
  • orElse 如果不返回当前,则返回其他。

因此,出现了以下行为:

代码语言:javascript
运行
复制
String foo = null;
=> Optional.ofNullable(foo).orElse("nonNull")
=> Optional.ofNullable(null).orElse("nonNull")
=> Optional.empty().orElse("nonNull")
=> return otherwise "nonNull"

就像它横穿

代码语言:javascript
运行
复制
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 是一个由静态实用程序方法组成的类,用于在对象上操作,或者在操作之前检查某些条件。

这些实用工具包括空安全或空容忍方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。

  • requireNonNullElse 如果为非空参数,则返回第一个参数,否则返回第二个参数(如果为非空)。

因此,行为上的差异:

代码语言:javascript
运行
复制
String foo = null;
=> Objects.requireNonNullElse(foo, "nonNull")
=> Objects.requireNonNullElse(null, "nonNull");

它进一步评估内部如果requireNonNull("nonNull", "defaultObj"),然后

代码语言:javascript
运行
复制
=> returns "nonNull" since its a non-null value

当它穿越时

代码语言:javascript
运行
复制
String foo = null, bar = null;
=> Objects.requireNonNullElse(foo, bar);
=> Objects.requireNonNullElse(null, bar);

它在内部检查是否是requireNonNull(bar, "defaultObj"),然后

代码语言:javascript
运行
复制
=> throws a NullPointerException

也被记录在案

throws NullPointerException -如果obj都是null 而 defaultObj是null

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46519014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档