Итак, я понимаю, что у вас могут быть потоки объектов, т.е. 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