Java8和x27之间的主要区别是什么;s可选,Scala';s选项和Haskell';也许吧?
我读过一些关于Java8即将推出的可选类型的帖子,我试图理解为什么人们一直认为它不如Scala的选项强大。据我所知,它有:Java8和x27之间的主要区别是什么;s可选,Scala';s选项和Haskell';也许吧?,java,scala,haskell,Java,Scala,Haskell,我读过一些关于Java8即将推出的可选类型的帖子,我试图理解为什么人们一直认为它不如Scala的选项强大。据我所知,它有: 高阶函数,如使用Java8Lambdas的map和filter 一元平面图 通过getOrElse类型函数进行短路 我错过了什么?我想到了一些可能性(奥托,我还没有看到人们真的这么说,所以他们可能意味着其他的东西): 没有模式匹配 与Scala的fold或Haskell的fromMaybe:您必须改为执行可选的.map(…).orElseGet(…) 没有一元语法 我自
- 高阶函数,如使用Java8Lambdas的map和filter
- 一元平面图
- 通过getOrElse类型函数进行短路
我错过了什么?我想到了一些可能性(奥托,我还没有看到人们真的这么说,所以他们可能意味着其他的东西):
fold
或Haskell的fromMaybe
:您必须改为执行可选的.map(…).orElseGet(…)
我自己也不会把这些称为“不太强大”,因为您可以用相应的Scala/Haskell类型来表达您所能表达的一切;这些都是简洁性/可用性问题。
可选
和可能
有效地对应。Scala有None
和Some[A]
作为子类化选项[A]
,这可能更直接地与Java类似,因为Java也可以这样做
大多数其他差异要么与Haskell/Scala中处理
可能
/选项
的易用性有关,因为Java作为一种语言的表现力较低,要么与Haskell/Scala中使用可能
/选项的一致性有关,其中许多保证和便利仅由类型提供一旦大多数库同意使用可选类型而不是null
s或异常,请立即启动。对于大多数目的,它们是等效的;主要区别在于Scala one与Scala的集成度很高,而Java one与Java的集成度很高
在我看来,最大的区别是Java是一种新的东西,对JVM来说是新的东西。目前,基于值的类和常规类之间没有真正的区别,但这种区别为JVM运行时消除Java对象开销铺平了道路。换句话说,a可以重写可选代码作为如何处理空值的指令,而不是为可选对象分配内存
Scala在中也做了类似的事情,尽管它是通过在编译器中而不是在JVM中取消类型绑定来完成的,并且它的使用是有限的。(选项不是一个值类。)“…比”听起来像是一个主观的讨论。然而,我还没有做任何事情。让我们看看这是怎么回事。根据,他们不会更新所有API来使用它(例如List.Get()
)。其余的都可以找到。任何使用“强大”一词的帖子都不值得你好奇。另外,你仍然可以使用null
。可选
/可能
的全部要点是引用不能为空
,因此允许它们为空(正如Java为了向后兼容所必须的那样)已经降低了一些好处。@AlexeyRomanov除了Scala标准库基本上设计为不使用空之外,因此,惯用的Scala代码只在涉及Java互操作时处理null。而在惯用Java中,一次Optional
到达。。。您仍然需要显式地检查所有内容是否为null,因为您的大多数值可能来自不喜欢Optional
而不是null的代码。“您必须改为使用Optional.map(…).orElseGet(…)”——这不是一回事,因为当Optional为空或Optional.map(…)时,会触发“else”部分是空的:)