Java 8的可选,Scala的选项和Haskell的可能之间的主要区别是什么?

时间:2014-03-13 04:11:25

标签: java scala haskell

我已经阅读了有关Java 8即将推出的可选类型的一些帖子,并且我试图理解为什么人们一直认为它不像Scala那样强大选项。据我所知,它有:

  • 高阶函数,如使用Java 8 lambdas的map和filter。
  • Monadic flatMap
  • 通过getOrElse类型函数短路。

我错过了什么?

3 个答案:

答案 0 :(得分:8)

OptionalMaybe实际上是对应的。 Scala具有NoneSome[A]作为子类Option[A],因为Java可以做得同样,所以它可以更直接地与Java进行比较。

大多数其他差异要么与Haskell / Scala中处理Maybe / Option的容易性有关,因为Java作为一种语言的表达力较差或使用{ Haskell / Scala中的{1}} / Maybe,只有大多数库同意使用可选类型而不是Option或异常,才会启用该类型提供的许多保证和便利。

答案 1 :(得分:7)

有些可能性浮现在脑海中(OTOH,我还没有看到人们真的这么说,所以他们可能意味着别的东西):

  1. 没有模式匹配。

  2. 不等同于Scala的fold或Haskell的fromMaybe:您必须改为optional.map(...).orElseGet(...)

  3. 没有monadic语法。

  4. 我也不会打电话给任何这些"不那么强大的"我自己,因为你可以用相应的Scala / Haskell类型表达你能做到的一切;这些都是简洁/可用性问题。

答案 2 :(得分:0)

在大多数情况下,它们是等效的;主要区别在于Scala很好地集成到Scala中,而Java很好地集成到Java中。

我认为最大的不同之处在于Java是value-based class.这对JVM来说是新的东西。目前,基于值的类和常规类之间没有真正的区别,但这种区别为JVM运行时消除Java对象开销铺平了道路。换句话说,future JVM可以重写可选代码作为如何处理空值的指令,而不是为Optional对象分配内存。

Scala与value classes做类似的事情,虽然它是由编译器中的拆箱类型而不是JVM完成的,但它的用法是有限的。 (选项不是一个值类。)