我已经阅读了有关Java 8即将推出的可选类型的一些帖子,并且我试图理解为什么人们一直认为它不像Scala那样强大选项。据我所知,它有:
我错过了什么?
答案 0 :(得分:8)
Optional
和Maybe
实际上是对应的。 Scala具有None
和Some[A]
作为子类Option[A]
,因为Java可以做得同样,所以它可以更直接地与Java进行比较。
大多数其他差异要么与Haskell / Scala中处理Maybe
/ Option
的容易性有关,因为Java作为一种语言的表达力较差或使用{ Haskell / Scala中的{1}} / Maybe
,只有大多数库同意使用可选类型而不是Option
或异常,才会启用该类型提供的许多保证和便利。
答案 1 :(得分:7)
有些可能性浮现在脑海中(OTOH,我还没有看到人们真的这么说,所以他们可能意味着别的东西):
没有模式匹配。
不等同于Scala的fold
或Haskell的fromMaybe
:您必须改为optional.map(...).orElseGet(...)
。
没有monadic语法。
我也不会打电话给任何这些"不那么强大的"我自己,因为你可以用相应的Scala / Haskell类型表达你能做到的一切;这些都是简洁/可用性问题。
答案 2 :(得分:0)
在大多数情况下,它们是等效的;主要区别在于Scala很好地集成到Scala中,而Java很好地集成到Java中。
我认为最大的不同之处在于Java是value-based class.这对JVM来说是新的东西。目前,基于值的类和常规类之间没有真正的区别,但这种区别为JVM运行时消除Java对象开销铺平了道路。换句话说,future JVM可以重写可选代码作为如何处理空值的指令,而不是为Optional对象分配内存。
Scala与value classes做类似的事情,虽然它是由编译器中的拆箱类型而不是JVM完成的,但它的用法是有限的。 (选项不是一个值类。)