java - 原始流与对象流和发生的实际装箱

标签 java java-stream primitive autoboxing

所以我知道你可以有对象流,即 Stream<T>和专业的原始流,例如IntStream , DoubleStream等。后者的好处之一是避免自动装箱。

另外,如果我们取 IntStream例如,它有专门的操作,例如接受 IntPredicate 的过滤器.

我想知道我是否有一个 IntStreamStream<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() >= 50intValue()为开箱步骤。此外,System.out.println 会在最终被调用的 Integer.toString 的实现中自行拆箱。

关于java - 原始流与对象流和发生的实际装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35209191/

相关文章:

java - java中的嵌套for循环

java - 如何在 JDBC 中启动事务?

java - 使用Java流合并一对 `int`数组

java-8 - "unordered"如何帮助 "distinct()"和 "groupingBy"

Java:获取用于反射的原始数组类的正确方法

java - 通过 JDBC 对 CSV 文件执行 SQL

java - FingerPaint 删除显示黑线

java - 从流中获取唯一对象(如果存在)

opengl - 如何让多边形抗锯齿工作?

java - java中的向下舍入 float 转换