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