Использование потоков с типами данных примитивов и соответствующими обертками

Во время игры с Java8 Streams-API я наткнулся на следующее:

Чтобы преобразовать массив примитивных объектов-оболочек кластера в Stream, мне просто нужно вызвать Stream.of(array). Но чтобы преобразовать массив примитивных типов данных, я должен вызвать .of(array) из соответствующего класса потока оболочки (класса) (< -, который звучит глупо).

Пример:

final Integer[] integers = {1, 2, 3};
final int[]     ints     = {1, 2, 3};


Stream.of(integers).forEach(System.out::println); //That works just fine

Stream.of(ints).forEach(System.out::println);     //That doesn't

IntStream.of(ints).forEach(System.out::println);  //Have to use IntStream instead


Мой вопрос (ы): Почему это? Соответствует ли это, например, поведение Arrays.asList(), которое также просто работает для массивов классов-оболочек?

Ответ 1

Java 8 stream framework имеет общий Stream<T> для объектов как элементов и три примитивных потока IntStream, LongStream, DoubleStream для основных трех примитивов. Если вы работаете с примитивами, используйте один из них, в вашем случае IntStream.

Смотрите изображение:

enter image description here

Что скрывается за тем, что:

  • Java generics не может работать с примитивными типами: возможно иметь только List<Integer> и Stream<Integer>, но не List<int> и Stream<int>

  • Когда была введена рамка Java Collections, она была введена только для классов, поэтому, если вы хотите иметь List из int s, вы должны обернуть их в Integer s. Это дорого!

  • Когда была внедрена инфраструктура Java Streams, они решили обойти эти накладные расходы и параллельно с "класс-ориентированными" потоки (используя механизм generics), они ввели три дополнительных набора всех функций библиотеки, специально предназначенных для наиболее важных примитивных типов: int, long, double.

И посмотрите также чудесное объяснение здесь: fooobar.com/info/106770/...