Есть ли в Java стандартный класс Option или Nullable? - PullRequest
6 голосов
/ 22 марта 2012

Nullable (C #) имеет немного другое значение, но в любом случае и Option (Scala), и Nullable могут использоваться для выражения понятия "значение или ничего".

Например, в случае, если вы хотите найти подстроку в строке - вместо неясного -1 в качестве Int, было бы лучше вернуть Option [Int] (в Scala это будет None даром).

Есть ли такой класс в стандартной Java? Если да, то что это?

Обратите внимание, я не спрашиваю, как написать такой класс.

Обновление

Как я уже писал, Nullable имеет другое значение. Учтите это:

Просто представьте Map [K, V] и метод get, семантика которого состоит в том, чтобы получить значение ключа, если такой ключ существует, или ничего, когда такого ключа нет.

Вы не можете использовать нуль по двум причинам, вы не можете использовать какой-либо конкретный класс по одной причине. Вариант [V] это путь.

Ответы [ 3 ]

5 голосов
/ 26 мая 2014

Вы спрашивали более двух лет назад, но два месяца назад Java SE 8 представила java.util.Optional<T>.Для ознакомления, смотрите эту статью Technet:

Устали от исключений нулевого указателя?Попробуйте использовать Java SE 8 в качестве опции!

5 голосов
/ 22 марта 2012

В Java обычный способ, которым вы это делаете, будет с null и классами Integer, Long и т. Д. (Которые являются справочными эквиваленты типов примитивных типов int, long и т. д., являясь ссылочными типами, ссылки могут быть null). Если у вас есть фон C #, Integer в Java (с автобоксом) похож на int? в C #.

Например, List#indexOf имеет эту подпись:

int indexOf(Object o)

... и делает то, о чем вы говорите. Если вы проектировали List и предпочитали null, вы могли бы определить его как:

Integer indexOf(Object o)

... и вернул null вместо -1 в случае "not found".

Существуют эти версии ссылочных типов всех примитивных типов в Java, и, конечно, все другие типы уже являются ссылочными типами, поэтому у вас уже есть опция null.

2 голосов
/ 22 марта 2012

Нет. В Java нет такого стандарта конструкции. *

Существует опция в FunctionalJava или, как отмечает yshavit, Необязательно в Guava ... Или вы можете создать свой собственный тип ... но без надлежащей языковой поддержки. ну, скажем так, я избегаю Java; -)

Удачного кодирования.


* Я не согласен с тем, что Integer или Double выполняют эту роль, поскольку они только обертывают фиксированный набор примитивов и не являются универсальным контейнером. Можно считать, что они охватывают случай Nullable, просто из-за фиксированного набора типов значений Java и ограничения C # Nullable (работает только для ValueTypes), но они не заменяют действительные Option тип.

Обратите внимание, однако, что Option из FJ или Guava по-прежнему использует (на самом деле, он должен) типы-оболочки (например, Integer) для обработки примитивов. Также обратите внимание, что Nullable в C # не совпадает с Option в Scala из-за вышеупомянутого ограничения.

...