首先,我知道这两种方法的区别。
Optional.of
:用于确保没有空,如果输入null,则为nullPointExcepctionOptional.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
更好吗?
发布于 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()
将不会被执行(也就是说,它的异常将不会被Objects.requireNonNull()
或requireNonNullElse()
以提供默认值,则可以使用requireNonNullElse()
来抛出异常。出于同样的原因,您不应该首先使用Optional.ofNullable().orElseThrow()
。
可选就像一个盒子
如果是包裹,你可能会想到可选的。当您需要发送一些东西时,您会去邮局(即从方法返回),在那里,必须发送的东西被放置在一个盒子中。当某人(即调用方)收到该包裹时,将立即将其解压。这就是称为Optional
的盒子的整个生命周期。
当根据应用程序的逻辑,需要从方法返回的对象不应该是null
时-使用Optional.of()
。它可以成功地发送包裹,也可以强调提出NullPointerException
存在问题。
如果给定的对象本质上是可空的,即null
不是异常情况,那么使用Optional.ofNullable()
,它将触发一个包含该对象的框或一个空框。
而调用方(即调用返回可选方法的方法)必须使用各种可选工具(如orElseThrow()
、orElseGet()
、ifPresent()
等)解压盒子。
https://stackoverflow.com/questions/71835972
复制相似问题