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")); 然而,在尝试访问以下内容时,直接实

在尝试从
可选项
或使用获取值时,如何避免显式抛出
异常

目前,这可能通过API
orElseThrow
得到保护,如下所示:

// 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。”@TalAvissar
Object x=Optional.orElse(null)
对我来说足够好了。@lexicore这对我来说是正确的答案(+1),看来
get
将被弃用。他们可能在他们的心智模型中有番石榴…@Talavisar我讨厌C#btw中的这个(可能只是我),这就像代码一直在尖叫或疑惑,同样,它可能只是一个比Java语言架构师Brian Goetz先生自己更好的权威源代码!!!imo
get()
应该在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();