НеобязательныйInt vs Необязательный <Целое>
При прокрутке документации для пакета java.util я был сузирован, обнаружив, что Optional<T>
и OptionalInt
не имеют отношения друг другу. Это, кажется, очень трудно поверить, так как это говорит о том, что они не связаны между собой классами.
- Почему у них нет общего интерфейса, класса, это подтипы или что-то, чтобы выявить отношения, которые у них есть? (Они очень похожие классы, когда вы смотрите на их использование.)
- Кроме того, зачем нужен дополнительный класс
OptionalInt
? Почему вы не можете использовать Optional<Integer>
? Я думал, что это связано с тем, что int
является примитивным, но нет OptionalChar
, поэтому это будет непоследовательный выбор дизайна.
Ответы
Ответ 1
Java 8 представила целую серию, посвящённую примитивам. Причина, скорее всего, в том, что примитивы бокса могут создать много отходов "коробки".
Например, это
OptionalInt optionalFirst = IntStream
.range(0, 100)
.filter(i -> i % 23 > 7)
.findFirst();
Здесь результат Optional<Integer>
будет непоследовательным. Также методы, такие как ifPresent(IntConsumer consumer)
, затем позволяют оставаться в мире IntStream
. Optional<Integer>
заставит вас конвертировать (что вы можете сделать легко, если хотите)
Нет необходимости в специальной поддержке для char
или short
или byte
, потому что все они могут быть представлены как int
. Недопустимый boolean
, но в потоке с ними не так много, поскольку есть только 2 значения.
Ответ 2
Для потоков Java 8 должен существовать класс OptionalInt
. Если вы посмотрите на Stream
класс, вы увидите, что много методы return Optional<T>
. Однако работа с Stream<Integer>
, Stream<Long>
или любыми другими потоками примитивов исчерпывается, поэтому существует класс IntStream
и LongStream
класс, который заменяет объект своим незанятым значением. Например, поиск суммы элементов a Stream<Integer>
не является тривиальным, тогда как для a IntStream
вы просто вызываете IntStream#sum
В этих классах JDK помогает заменять Optional<T>
на OptionalInt
, OptionalLong
и т.д.
Ответ 3
OptionalInt
- значение для хранения контейнера примитивного типа int
. Примитивные типы не могут использоваться как параметры типа для общих классов, поэтому он не может быть подклассом Optional<T>
.