Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Optional<Integer> и OptionalInt

#java


В чём отличие Optional и OptionalInt, и в каких случаях какой из этих типов
лучше применять?
    


Ответы

Ответ 1



Отличие в том, что при наличии значения Optional.get вернет объект (Integer), а OptionalInt.getAsInt — примитивное значение (int). Соответственно, чтобы избежать лишнего обертывания примитивных значений при работе с int применяется OptionalInt , а при работе с объектами Integer — Optional. Рассмотрим на примере интерфейса с двумя методами: interface Test { int getInt(); Integer getInteger(); } При обработке значений имеет смысл использовать соответствующие классы (на примере Stream API): List list = //получаем список OptionalInt intFirst = list.stream().mapToInt(Test::getInt).findFirst(); Optional integerFirst = list.stream().map(Test::getInteger).findFirst(); Использование IntStream и OptionalInt для поля типа Integer потенциально приведет к NullPointerException. Использование Optional и Stream для int приведет к лишнему обертыванию значений. Необходимость специальных классов обусловлена тем, что в Java примитивные типы не могут использоваться в качестве параметров обобщенных типов. Из за этого классы Stream и Optional не могут быть использованы для работы с примитивными значениями. Использовать вместо примитивов классы-обертки непозволительно из-за затрат производительности на упаковку значений в объекты. Поэтому для часто используемых примитивных типов создан набор специальных классов: IntStream, LongStream, DoubleStream и OptionalInt, OptionalLong, OptionalDouble.

Комментариев нет:

Отправить комментарий