所以我知道你可以有对象流,即 Stream<T>
和专业的原始流,例如IntStream
, DoubleStream
等。后者的好处之一是避免自动装箱。
另外,如果我们取 IntStream
例如,它有专门的操作,例如接受 IntPredicate
的过滤器.
我想知道我是否有一个 IntStream
与 Stream<Integer>
在这一点上你节省了拳击,例如
intstream.filter(x -> x >= 50).forEach(x -> System.out.println(x));
对比
stream.filter(x -> x >= 50).forEach(x -> System.out.println(x));
在第一个示例中,我看不到任何装箱或拆箱操作。在第二个例子中,装箱/拆箱发生在哪里?因为如果流是 Stream<Integer>
过滤器接受 Predicate<Integer>
那么肯定不需要装箱/拆箱,IntConsumer
也是如此对比Consumer<T>
?
最佳答案
拆箱发生在谓词内部:在 stream.filter(x -> x >= 50)
中,Predicate
本质上变成了 (Integer x) -> x.intValue() >= 50
,intValue()
为开箱步骤。此外,System.out.println
会在最终被调用的 Integer.toString
的实现中自行拆箱。
关于java - 原始流与对象流和发生的实际装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35209191/