Java Optional.get()与重载Optional.orelsetrow()的比较
在尝试从Java Optional.get()与重载Optional.orelsetrow()的比较,java,optional,java-10,Java,Optional,Java 10,在尝试从可选项或使用获取值时,如何避免显式抛出异常 目前,这可能通过APIorElseThrow得到保护,如下所示: // exception could be replaced with any other Integer opt = anyOddInStream.orElseThrow( () -> new NoSuchElementException("No value present")); 然而,在尝试访问以下内容时,直接实
可选项
或使用获取值时,如何避免显式抛出异常
目前,这可能通过APIorElseThrow
得到保护,如下所示:
// exception could be replaced with any other
Integer opt = anyOddInStream.orElseThrow(
() -> new NoSuchElementException("No value present"));
然而,在尝试访问以下内容时,直接实现get
会令人失望(当您可能不愿意显式抛出异常时)
// the following not only just fails but throws an exception as well
Integer previous = anyOddInStream.get();
如果一个人想确保
可选的有一个值,如果没有,他们就不想继续向前传播null
,那该怎么办?另一种方法是获取可选的值,而不是(很可能无法满足用户的期望)将其替换为JDK10中引入的更详细的API,称为。在—
Optional.get()
是一个“吸引人的讨厌东西”,对你来说太诱人了
程序员,导致频繁的错误。人们并不期望有一个能干的人
抛出异常。带有的可选.get()
的替换API
应添加等效语义
可选anyOddInStream=Stream.of(2,4,6,8)
.filter(x->x%2==1)
.findAny();
//在阅读本文时,可以很好地了解可能的异常处理
var电流=anyOddInStream.orelsetrow();
注意:-这两个API的底层实现是相同的,但后者更清楚地指出,如果值不存在,则默认情况下会抛出一个NoTouchElementException
,该值内联到消费者用作显式替代的现有实现中。在我看来,可选。get()
是代码的味道。它经常与Optional.isPresent()
结合使用,完全违背了Optional.get()
的目的和理念。下面是一个更完整的推理和讨论:
所以不要使用Optional.get()
。如果要为缺少的值返回null
,请调用Optional。orElse(null)
Java 8是对平台的巨大改进,但我们犯的少数错误之一是命名Optional.get()
,因为该名称只邀请人们调用它,而不调用isPresent()
,首先破坏了使用可选的全部意义。(如果这是我们在如此大的发布中犯下的最严重的错误,那么我们做得相当不错。)
在Java9的时间范围内,我们建议反对Optional.get()
,但公众对此的反应是。。。让我们说冷。作为一个较小的步骤,我们在10(参见)中引入了orelsetrow()
,作为当前get()
有害行为的一个更透明的同义词。IDE警告无条件使用get()
,而不是orelsetrow()
,这是在教人们更好地编写代码方面向前迈出的一步。从某种意义上说,问题是对当前形势的“半杯半空”看法get()
仍然存在问题
我们希望在未来的版本中进一步改善这种情况,但可能需要一些时间才能让更多的社区参与进来。@shmosel这并不重要。“如果不存在值,则为NoTouchElementException”是API。关键是引发异常的不是OP。我绝对不理解这个添加,是不是准备删除/弃用get
?“我真希望@StuartMarks会来这里……”尤金·布赖恩已经回答了。但是弃用get()。(还要注意的是,@-通知只有在此人之前发表过评论时才起作用,因此我没有从您的评论中收到通知。我只是碰巧看到了它,因为我监视了可选的标记。)这篇文章很有用(我只是把它当作一个复制品),但这个问题真的很难理解。请尽量说清楚。@shmosel是的,在我问这个问题的时候,我认为这个问题应该是什么,而当前过载的实现已经提供了什么,这两者之间有一个很好的差距。事实上,回顾过去,问题只是寻找使用get
与orelsetrow
的区别。老实说,就目前的情况而言,我自己觉得这两种方法都让消费者陷入了麻烦的境地。(点评)@nullpointer通常你可以通过orElse
、orElseGet
、orelsetrow
或map
@nullpointer实现几乎所有功能。我不确定你最后的评论想说什么。我的观点是,你不一定需要get()
来“如果,一个人想确保可选的或者有一个值,如果没有,他就不想继续向前传播null。”@TalAvissarObject x=Optional.orElse(null)
对我来说足够好了。@lexicore这对我来说是正确的答案(+1),看来get
将被弃用。他们可能在他们的心智模型中有番石榴…@Talavisar我讨厌C#btw中的这个(可能只是我),这就像代码一直在尖叫或疑惑,同样,它可能只是一个比Java语言架构师Brian Goetz先生自己更好的权威源代码!!!imoget()
应该在Java11中被弃用/删除,这样人们就不会在isPresent
中使用它了,不幸的是,这对新的Java开发人员来说是一个很有吸引力的反模式。也许有时候为了社区的利益需要做一些事情,即使社区一开始并不欣赏它。。。
Optional<Integer> anyOddInStream = Stream.of(2, 4, 6, 8)
.filter(x -> x % 2 == 1)
.findAny();
// one could be well aware of the possible exception handling while reading this
var current = anyOddInStream.orElseThrow();