当你有
Stream.of(1 ,10).reduce(0,(v1, v2) -> v1 + v2);
对比
IntStream.of(1 ,10).reduce(0,(v1, v2) -> v1 + v2);
`IntStream 是如何工作的?避免隐藏的拳击费用?
为什么拳击在性能方面很昂贵?
最佳答案
IntStream
是 Stream<T>
的特化哪个进程int primitive
值。
查看IntStream
接口(interface):
IntStream filter(IntPredicate predicate);
IntStream map(IntUnaryOperator mapper);
...
可以看到这个接口(interface)只使用int primitive
Predicate
的专业版本, Function
, Consumer
...所以它不需要装箱来与 int 一起工作(因为它直接与 int 一起操作)
关于自动装箱的性能成本,可以引用java guide :
It is not appropriate to use autoboxing and unboxing for scientific computing, or other performance-sensitive numerical code
这是因为,每次调用操作都需要int
或Integer
或输入int
到Integer
容器中,编译器会为您注入(inject)一个 box/unbox 方法调用。
对于正常操作来说,性能相当微不足道,但如果您有密集的循环或时间关键的代码行,那么您应该避免自动装箱。
关于java - IntStream 如何避免隐性拳击成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56404114/