Каковы ключевые отличия между 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, и его использования ограничено. (Опция не является классом значений.)