Это одно и то же?
Оба расширяются BaseStream
. Таким образом, они имеют общий интерфейс. Но методы filter
и mapToInt
не принадлежат этому интерфейсу.
В чем разница между этими двумя?
Stream<T>
- это Stream
из T
, где T
- это параметр общего типа Stream
. Поскольку параметр универсального типа не может иметь тип примитива в качестве аргумента типа, нет способа объявить Stream<int>
. Чтобы иметь поток примитивных целых чисел, был определен выделенный тип IntStream
.
Если у вас есть Stream<Integer>
и вы хотите использовать методы, которые предлагает тип IntStream
(то есть min()
, toArray()
), вам нужно сначала преобразовать элементы Integer
в элементы int
. Это задача метода mapToInt
, который применяется к Stream<T>
и возвращает IntStream
. Для преобразования элементов в int
этот метод требует Function
, который выполняет фактическое отображение / преобразование.
Например:
int[] arrayOfPositiveInts = Stream.of(0, 1, 2, 3, 4)
.filter(i -> i > 0)
.mapToInt(Integer::intValue)
.toArray();
Здесь показан метод filter
, который применяется к Stream<Integer>
, но использует распаковку для сравнения элементов Integer
с int
0
. Метод mapToInt
использует метод Integer.intValue()
для явного возврата Integer
соответствующего int
значения.
Из-за распаковки вы также можете использовать:
.mapToInt(i -> i)
Но Function.identity()
, чья реализация делает то же самое, не будет работать:
.mapToInt(Function.identity()
потому что это ( JavaDoc ):
всегда возвращает входной аргумент.
Тип Stream
равен Integer
, тогда как mapToInt
ожидает int
.
Подведение итогов:
Разница между Stream
и IntStream
(согласно названию этого вопроса) заключается в типе потоковых элементов. Stream
обрабатывает произвольные ссылочные типы . IntStream
- это выделенный тип с элементами примитива int
. И, конечно, оба типа предлагают разные методы.