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

Optional.ofNullable()和`Optional.of()有什么区别?
EN

Stack Overflow用户
提问于 2022-04-12 01:23:41
回答 1查看 2.6K关注 0票数 3

首先,我知道这两种方法的区别。

  • Optional.of:用于确保没有空,如果输入null,则为nullPointExcepction

  • Optional.ofNullable:可能为null,也可能不是null。用于灵活地响应.

那么,如果我将orElseThrow(() -> new NullPointerException("null data"))添加到这个项目中,它最终会是相同的吗?

我想抛出一个包含显式内容的错误。

所以我得到了Optional.ofNullable(data).orElseThrow(() -> new NullPointerException("null data")))

用它作为这种毫无意义的行为?

Optional.of(data).orElseThrow(() -> new NullPointerException("null data")))

我认为这也是可能的,但我只是使用ofNullable()使代码看起来一致。

总之,最后如果添加orElseThrow(nullPoint)of还是ofNullable都是相同的结果吗?

那么of.orElseThrow更好吗?

EN

回答 1

Stack Overflow用户

发布于 2022-04-12 13:27:44

首先,我知道这两种方法的区别。

Optional.of:用于确保不存在null,如果输入null,则为nullPointExcepction

Optional.ofNullable:可能是也可能不是null。用于灵活的反应。

有一个明显的误解点。

Optional.of()的目的不是“确保没有null__”。它并不意味着用于断言传递给它的值是非空的。对于这样的验证,您可以使用Objects.requireNonNull(),它将抛出一个NPE,或者返回一个非空值。

为了在同一个页面上,您必须记住的第一件重要的事情是,在JDK中引入选项只为了一个特定的目的--作为返回类型的。当可选对象被用作参数类型或字段类型时,或者当可选对象存储在集合中时,任何其他情况都不被认为是一种良好的实践。此外,创建一个可选选项只是为了在其上链接方法或隐藏空检查,因此被认为是一个antipattern.。

以下是JDK的开发人员@StuartMarks的答案中的a couple of quotes

可选的主要用途如下所示:

可选的目的是为库方法返回类型提供一种有限的机制,如果明显需要表示“无结果”,并且使用null极有可能导致错误。典型的代码嗅探不是使用方法链接来处理某个方法返回的可选代码,而是从可为空的东西()创建一个可选的,以链接方法避免条件词

我也建议你看看这个问题的答案,,也是斯图尔特马克。

尽管如此,组合Optional.of().orElseThrow()是错误的,而且毫无意义:

如果提供的数据为

  • ,则of()将引发NPE,而orElseThrow()将不会被执行(也就是说,它的异常将不会被
  • 滥用,因为创建可选对象不是为了返回由它包装的可空变量,而是为了隐藏null-check (请看上面的引号)。这掩盖了你代码的目的。如果给定的值不能是Objects.requireNonNull()requireNonNullElse()以提供默认值,则可以使用requireNonNullElse()来抛出异常。

出于同样的原因,您不应该首先使用Optional.ofNullable().orElseThrow()

可选就像一个盒子

如果是包裹,你可能会想到可选的。当您需要发送一些东西时,您会去邮局(即从方法返回),在那里,必须发送的东西被放置在一个盒子中。当某人(即调用方)收到该包裹时,将立即将其解压。这就是称为Optional的盒子的整个生命周期。

当根据应用程序的逻辑,需要从方法返回的对象不应该是null时-使用Optional.of()。它可以成功地发送包裹,也可以强调提出NullPointerException存在问题。

如果给定的对象本质上是可空的,即null不是异常情况,那么使用Optional.ofNullable(),它将触发一个包含该对象的框或一个空框。

调用方(即调用返回可选方法的方法)必须使用各种可选工具(如orElseThrow()orElseGet()ifPresent()等)解压盒子。

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

https://stackoverflow.com/questions/71835972

复制
相关文章

相似问题

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