Страницы

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

понедельник, 20 мая 2019 г.

Optional и OptionalInt

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


Ответ

Отличие в том, что при наличии значения 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

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

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