最后,this article介绍新Java 8 Optional
,声明
可选功能并不像Scala中的Option [T]那么强大(但是在 至少它不允许包装null)。 API不是 直接作为空值处理,可能要慢得多。但是 编译时检查以及可读性和文档的好处 一贯使用的可选值大大优于劣势
我对Scala有一个非常基本的了解,而且我熟悉Java 8 Optional
,所以初看起来,我不清楚两者之间有什么区别,如果有的话。
我知道,例如,在Scala中我可以使用模式匹配来测试Option
并让我的生活更轻松。但是,不包括Scala语法的特性,我想知道在Scala中我是否可以使用Option
来处理Java中的Optional
。
希望这不是一个愚蠢的问题,但每当我读到“强大”的时候,问号都会浮现在我的头上。
答案 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