Подтвердить что ты не робот

НеобязательныйInt vs Необязательный <Целое>

При прокрутке документации для пакета java.util я был сузирован, обнаружив, что Optional<T> и OptionalInt не имеют отношения друг другу. Это, кажется, очень трудно поверить, так как это говорит о том, что они не связаны между собой классами.

  • Почему у них нет общего интерфейса, класса, это подтипы или что-то, чтобы выявить отношения, которые у них есть? (Они очень похожие классы, когда вы смотрите на их использование.)
  • Кроме того, зачем нужен дополнительный класс OptionalInt? Почему вы не можете использовать Optional<Integer>? Я думал, что это связано с тем, что int является примитивным, но нет OptionalChar, поэтому это будет непоследовательный выбор дизайна.
4b9b3361

Ответ 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>.