Java Optional和Scala Option的区别

23
最后,介绍Java 8的新功能Optional的这篇文章指出:

Optional不像Scala中的Option[T]那样强大(但至少它不允许包装null)。该API不如空值处理简单明了,可能会慢得多。但是,在一致使用Optional的情况下,编译时检查的优点以及可读性和文档价值远远超过了缺点。

我对Scala有基本的了解,并且正在熟悉Java 8的Optional,所以乍一看,我并不清楚两者之间的区别(如果有的话)。
例如,我知道在Scala中,我可以使用模式匹配来测试Option并使我的生活更加轻松。但是,除了Scala语法的特性之外,我想知道在Scala中是否有一些我可以使用Option而无法使用Java中Optional的功能。
希望这不被标记为愚蠢的问题,但每次我读到“强大”这个词,脑海中都会浮现问号。

如果Scala和Java之间的语法差异不在讨论范围内,除了OptionOptional接口不同之外还有什么呢?或者你还想引出其他问题吗? - Dave Swartz
文章链接失效。 - Scorpion
4
不,它没有损坏。NoBlogDefFound 是博客名称。 - Naetmul
2个回答

17
如果我们谈论的不是语法相关的差异,Tomasz Nurkiewicz在他的博客文章开头段落中几乎突出了最大的差异: “Optional”是在Java 8中引入的,因此在标准Java库中并没有被广泛使用,也永远不会为了向后兼容性原因。 (强调是我的 - 虽然鉴于新的“default”方法,我不会如此坚定地认为“永远”)
因此,Scala的“Option”的最大区别和最大优势似乎仅仅是它更紧密地集成到语言的API中
首先,当你开始使用Scala时,你很可能会早期接触到它,因此也会接触到它的使用模式,尤其是通过Scala的Map#get

反过来看,如果你看一下Scala的Option API,你会发现它被“嵌入”到Scala的集合层次结构中,这意味着你可以在需要时透明地将其用作集合 - 例如,不需要库的最终开发人员处理其特定性。


此外,编译器在处理两种语言中的典型用法模式时肯定存在差异。例如,在Scala中对SomeNone进行模式匹配时,当前编译器(2.10.x)将首先通过instanceof进行类型检查,然后才可能提取值。当然,这是否比Optional正在执行的操作更快(可能是字段加载,与null进行比较并根据情况进行分支),就JIT而言,又是另一回事了。 - mikołak
2
我认为另一个因素是Scala,与Java不同,它极大地抑制了对空引用的使用。仅凭这一点,我认为Java的Optional在实际应用中的实用性会降低... - seand
@seand:是的,那基本上就是"Option被整合到API中"的一个影响(或更可能是原因)之一。但如果你是这个意思,我不认为任何理智的人会在Scala代码中使用Java的Optional - mikołak
1
当你使用Scala编程时,可以相当安全地假设给定的变量不为null(除非你正在与Java进行接口交互)。因此,Option是一种有用的机制,用于指示“嘿,这个可能没有值,你最好能够处理它...”。但在Java8中,这种情况可能并不总是适用。 - seand
@TheTerribleSwiftTomato:如果我理解正确,问题不在于类本身,而在于可用的库。Option和Optional具有相同的语义。 - giampaolo
3
基本上是的。Java中的Optional甚至是单子(of ~= unitflatMap ~= bind)。基本语义大多相同。但是,其“威力”来自于与各自编程语言标准库的集成和使用。乍一看似乎不是什么大不了的事情,但它具有深远的后果——seand的最后一条评论在这方面是正确的。 - mikołak

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接