Итак, я понимаю, что у вас могут быть потоки объектов, т.е. Stream<T> и специальные примитивные потоки, например. IntStream, DoubleStream и т. д. Одним из преимуществ последнего является отсутствие автоматического бокса.
Кроме того, если мы возьмем IntStream в качестве примера, у него есть специальные операции, такие как фильтр, который принимает IntPredicate.
Мне было интересно, если бы у меня было IntStream против Stream<Integer>, в какой момент вы экономите на боксе, например.
intstream.filter(x -> x >= 50).forEach(x -> System.out.println(x));
vs
stream.filter(x -> x >= 50).forEach(x -> System.out.println(x));
В первом примере я не вижу упаковки или распаковки. Во втором примере где происходит упаковка/распаковка? Потому что, если поток равен Stream<Integer>, а фильтр принимает Predicate<Integer>, тогда, конечно, нет необходимости упаковывать/распаковывать, и то же самое для IntConsumer против Consumer<T>?
Integer(сложение, сравнение и т. д.) требует распаковки. 09.02.2016