【问题标题】:Difference between Java Optional and Scala OptionJava Optional 和 Scala Option 的区别
【发布时间】:2014-03-09 23:47:17
【问题描述】:

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

Optional 不如 Scala 中的 Option[T] 强大(但在 至少它不允许包装 null)。 API 不像 像空处理一样简单,而且可能要慢得多。但是 编译时检查以及可读性和文档的好处 使用 Optional 的值始终大大优于劣势

我对 Scala 有非常基本的了解,并且我正在熟悉 Java 8 Optional,所以乍一看,我不清楚两者之间有什么区别(如果有的话)。

我知道,例如,在 Scala 中,我可以使用模式匹配来测试 Option,让我的生活更轻松。但是,不包括 Scala 语法的特性,我想知道是否有一些我可以用 Scala 中的 Option 做而我不能用 Java 中的 Optional 做的事情。

希望这不会被标记为愚蠢的问题,但是每次我读到那个“强大”时,问号都会飞过我的头。

【问题讨论】:

  • 如果 Scala 和 Java 之间的语法差异超出了范围,除了 OptionOptional 的接口不同之外还有什么不同?或者你还有什么要画的吗?
  • 文章链接失效
  • 没有。它没有坏。 NoBlogDefFound 是博客名称。

标签: java scala optional scala-option


【解决方案1】:

如果我们谈论的是与语法无关的差异,Tomasz Nurkiewicz 在他的博客文章的开头段落中几乎强调了最大的差异:

可选是在 Java 8 中引入的,所以很明显 它没有被使用 贯穿标准 Java 库 - 永远不会 向后兼容的原因。

(emph。我的 - 尽管考虑到新的 default 方法,我不会那么坚持“从不”)

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

首先,在您开始使用 Scala 的早期,您很可能会接触到它,以及它的使用模式 - 最值得注意的是,通过 Scala 的Map#get

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

【讨论】:

  • 此外,编译器在处理两种语言的典型使用模式方面肯定存在差异。例如,当您在 Scala 中对 SomeNone 进行模式匹配时,当前编译器 (2.10.x) 将首先通过 instanceof 进行类型检查,然后才可能提取值。这是否比 Optional 正在做的更快(可能是字段加载,与 null 相比,并根据是否是分支),w.r.t 对于 JIT,当然是另一回事了。
  • 我认为另一个因素是 Scala,与 Java 不同的是,它非常不鼓励使用空引用。我认为仅此一项就会降低 Java 的 Optional 在实际应用中的实用性......
  • @seand:是的,这几乎是“Option 被集成到 API 中”的含义之一(或者,更有可能是原因)。但我认为没有人会在 Scala 代码中使用 Java 的 Optional,如果这就是你的意思的话。
  • 当您在 Scala 中编码时,假设给定变量不为空是非常安全的(除非您正在与 Java 交互)。因此,Option 是一种有用的机制,用于指示“嘿,这可能没有价值,你最好能够处理它......”。但在 Java8 中,这可能并不总是适用。
  • @giampaolo :本质上,是的。 basic 语义大体相同,Java 的Optional 甚至是一元的(of ~= unitflatMap ~= bind)。 “力量”来自与各自语言标准库的集成和使用。乍一看,这似乎没什么大不了的,但会产生深远的影响 - sead 的最后评论在这方面是正确的。
【解决方案2】:

我想在前面的答案中补充一点,除了 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

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2021-09-05
    • 2011-11-05
    • 2011-09-20
    • 2021-12-27
    相关资源
    最近更新 更多