Подтвердить что ты не робот

Разница между Java Option и опцией Scala

В самом конце эта статья, представляющая новую Java 8 Optional, указывает, что

Опция не такая мощная, как Option [T] в Scala (но при по крайней мере, это не позволяет обернуть нуль). API не так прямолинейно, как нулевая обработка и, вероятно, намного медленнее. Но преимущества проверки времени компиляции и удобочитаемости и документации значение Необязательно используемого последовательно значительно превосходит недостатки

У меня есть очень простые знания о Scala, и я знакомлюсь с Java 8 Optional, поэтому, с первого взгляда, мне не ясно, какие различия между ними, если они есть.

Я знаю, например, что в Scala я могу использовать сопоставление образцов для тестирования Option и сделать мою жизнь проще. Но, не считая особенностей синтаксиса Scala, я хотел бы знать, есть ли что-то, что я могу сделать с Option в Scala, которое я не могу сделать с Optional в Java.

Надеюсь, это не отмечено как глупый вопрос, но каждый раз, когда я читаю, что "мощный", вопросительные знаки летят над моей головой.

4b9b3361

Ответ 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