Разница между Java Option и опцией Scala
В самом конце эта статья, представляющая новую Java 8 Optional
, указывает, что
Опция не такая мощная, как Option [T] в Scala (но при по крайней мере, это не позволяет обернуть нуль). API не так прямолинейно, как нулевая обработка и, вероятно, намного медленнее. Но преимущества проверки времени компиляции и удобочитаемости и документации значение Необязательно используемого последовательно значительно превосходит недостатки
У меня есть очень простые знания о Scala, и я знакомлюсь с Java 8 Optional
, поэтому, с первого взгляда, мне не ясно, какие различия между ними, если они есть.
Я знаю, например, что в Scala я могу использовать сопоставление образцов для тестирования Option
и сделать мою жизнь проще. Но, не считая особенностей синтаксиса Scala, я хотел бы знать, есть ли что-то, что я могу сделать с Option
в Scala, которое я не могу сделать с Optional
в Java.
Надеюсь, это не отмечено как глупый вопрос, но каждый раз, когда я читаю, что "мощный", вопросительные знаки летят над моей головой.
Ответы
Ответ 1
Если мы говорим о различиях, которые не связаны с синтаксисом, Томаш Нуркевич в значительной степени выделяет самую большую в первых абзацах своего блога:
Необязательный был введен в Java 8, поэтому, очевидно, он не используется во всей стандартной библиотеке Java - и никогда не будет для соображения обратной совместимости.
(emph my - хотя я бы не был так категоричен на "никогда", учитывая новые методы default
)
Таким образом, самая большая разница и наибольшее преимущество Scala Option
, кажется, просто , что он гораздо более тесно интегрирован в API языка.
Прежде всего, вы, скорее всего, получите доступ к нему и, следовательно, его шаблон использования, в начале, когда вы начнете использовать Scala - наиболее заметно, через Scala Map#get
.
И наоборот - если вы посмотрите на Scala API-интерфейс Option, вы увидите, что он "сплайсирован" в иерархию коллекции Scala, что означает, что вы можете прозрачно использовать его в качестве коллекции, когда вам это нужно - например без, скажем, конечного разработчика вашей библиотеки, когда-либо имеющего дело с ее особенностями.
Ответ 2
Я хотел бы добавить к предыдущему ответу, что помимо Java Необязательно не интегрироваться в стандартную java-библиотеку (и, конечно, другие библиотеки), есть еще одна большая разница.
Java Optional не является Serializable и поэтому не может использоваться в полях любых Java-компонентов, которые должны быть сериализуемыми.
Java Дополнительная спецификация: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Спецификация Scala: https://www.scala-lang.org/api/2.12.x/scala/Option.html