Java8的可选选项、Scala的选项和Haskell的选项之间的关键区别是什么?
我读过一些关于Java8即将推出的可选类型的帖子,我试图理解为什么人们一直认为它不如Scala的选项强大。据我所知:
- 高阶函数,比如使用Java8Lambdas的map和filter李>
- 一元平面图
- 通过getOrElse类型函数短路李>
我错过了什么
你可以在下面搜索框中键入要查询的问题!
我读过一些关于Java8即将推出的可选类型的帖子,我试图理解为什么人们一直认为它不如Scala的选项强大。据我所知:
我错过了什么
# 1 楼答案
我想到了一些可能性(OTOH,我还没有看到人们真的这么说,所以他们可能有别的意思):
没有模式匹配
没有比Scala的
fold
或Haskell的fromMaybe
更好的方法:你必须做optional.map(...).orElseGet(...)
没有一元语法
我自己也不会把这些称为“不那么强大”,因为你可以用相应的Scala/Haskell类型来表达你所能表达的一切;这些都是简洁性/可用性方面的问题
# 2 楼答案
在大多数情况下,它们是等价的;主要区别在于Scala one很好地集成到Scala中,而Java one很好地集成到Java中
在我看来,最大的区别是Java是一个value-based class.对JVM来说是新的东西。目前,基于值的类和常规类之间没有真正的区别,但这种区别为JVM运行时消除Java对象开销铺平了道路。换句话说,future JVM可以重写可选代码,作为如何处理空值的指令,而不是为可选对象分配内存
Scala与value classes做了一些类似的事情,尽管它是通过在编译器中而不是在JVM中拆开类型来完成的,而且它的使用是有限的。(选项不是值类。)