Каковы ключевые отличия между Java 8 Дополнительно, Scala Option и Haskell Возможно?
Я прочитал несколько сообщений о предстоящем необязательном типе Java 8, и я пытаюсь понять, почему люди продолжают предлагать его не так сильно, как Scala Option. Насколько я могу судить, это:
- Функции более высокого порядка, такие как карта и фильтр, используя Java 8 lambdas.
- Monadic flatMap
- Короткое замыкание через функции типа getOrElse.
Что мне не хватает?
Ответы
Ответ 1
Некоторые возможности приходят на ум (OTOH, я не видел, чтобы люди действительно говорили это, поэтому они могли бы означать что-то еще):
-
Нет сопоставления с образцом.
-
Нет эквивалента Scala fold
или Haskell fromMaybe
: вместо этого вы должны сделать optional.map(...).orElseGet(...)
.
-
Нет монадического синтаксиса.
Я также не стал бы называть себя ни одним из этих "менее мощных", поскольку вы можете выразить все, что можете, с помощью соответствующих типов Scala/Haskell; это все проблемы с лаконичностью/удобством использования.
Ответ 2
Optional
и Maybe
эффективно соответствуют. Scala имеет None
и Some[A]
в качестве подкласса Option[A]
, который может быть более непосредственно сопоставим с Java, поскольку Java могла бы сделать то же самое.
Большинство других различий связано с простотой обработки Maybe
/Option
в Haskell/Scala, которая не будет транслироваться, поскольку Java менее выразительна как язык или согласованность использования Maybe
/Option
в Haskell/Scala, где многие гарантии и удобства, предоставляемые типом, запускаются только тогда, когда большинство библиотек согласились использовать необязательные типы вместо null
или исключений.
Ответ 3
Для большинства целей они эквивалентны; основное отличие состоит в том, что Scala один хорошо интегрирован в Scala, а Java - хорошо интегрирован в Java.
Самая большая разница в моем сознании заключается в том, что Java является классом, основанным на значении. Это что-то новое для JVM. В настоящий момент нет реальной разницы между основанными на значении и регулярными классами, но это различие открывает путь для времени выполнения JVM для устранения накладных расходов объекта Java. Другими словами, будущая JVM может переписать Необязательный код как директиву о том, как обрабатывать значения null, а не выделять память для дополнительных объектов.
Scala делает что-то подобное с классами значений, хотя это делается с помощью типов unboxing в компиляторе, а не в JVM, и его использования ограничено. (Опция не является классом значений.)