Java Optional和Scala Option之间的区别

时间:2014-02-11 22:34:46

标签: java scala optional scala-option

最后,this article介绍新Java 8 Optional,声明

  

可选功能并不像Scala中的Option [T]那么强大(但是在   至少它不允许包装null)。 API不是   直接作为空值处理,可能要慢得多。但是   编译时检查以及可读性和文档的好处   一贯使用的可选值大大优于劣势

我对Scala有一个非常基本的了解,而且我熟悉Java 8 Optional,所以初看起来,我不清楚两者之间有什么区别,如果有的话。

我知道,例如,在Scala中我可以使用模式匹配来测试Option并让我的生活更轻松。但是,不包括Scala语法的特性,我想知道在Scala中我是否可以使用Option来处理Java中的Optional

希望这不是一个愚蠢的问题,但每当我读到“强大”的时候,问号都会浮现在我的头上。

2 个答案:

答案 0 :(得分:15)

如果我们谈论的是与语法不相关的差异,Tomasz Nurkiewicz几乎突出了他博客文章开头段落中最大的一个:

  

在Java 8中引入了Optional,所以显然没有使用它   整个标准Java库 - 和永远不会   向后兼容的原因。

(我的 - 虽然我不会对“从不”这么坚定,但考虑到新的default方法)

因此Scala Option的最大区别和最大优势似乎只是,它更紧密地集成到语言的API中

首先,当你开始使用Scala时,你很可能会在早期使用Scala时获得它的使用模式 - 最值得注意的是,通过Scala的Map#get

相反 - 如果你看一下Scala的Option API,你会看到它被“拼接”到Scala的集合层次结构中,这意味着你可以在需要时透明地将它作为集合使用 - 例如没有,比方说,你的图书馆的最终开发者处理它的特殊性。

答案 1 :(得分:0)

我想补充一下前面的答案,除了不将Java Optional未集成到标准Java库(当然还有其他库)之外,还有另一个很大的区别。

Java Optional不可序列化,因此不能在任何应序列化的Java Bean的字段中使用。

Java可选规范:https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

Scala选项规格:https://www.scala-lang.org/api/2.12.x/scala/Option.html