应优先使用IntStream、LongStream、DoubleStream等原始类型流,从源头避免装箱拆箱;创建时用range、Arrays.stream(intArray)等原生方式;中间操作用int语义函数接口;终端操作返回int、OptionalInt等轻量结果;配套使用原始类型集合与函数接口。

直接用 IntStream、LongStream 和 DoubleStream 替代 Stream<integer></integer>、Stream<long></long>、Stream<double></double>,就能从源头绕过装箱拆箱——它们操作的是原始类型,不创建任何包装对象。
从数据源头就走原始流路径
别让整数先变成 Integer 对象再进流。创建时就要选对方式:
- 生成范围数据:用
IntStream.range(0, 1000),别用Stream.iterate(0, i -> i + 1).limit(1000) - 数组转流:用
Arrays.stream(intArray)(返回IntStream),别用Arrays.asList(intArray).stream()(先全装箱成List<Integer>) - 集合转流:如果已有
List<Integer>,优先重构为int[]或用stream.mapToInt(Integer::intValue)尽早转出,但最好一开始就避免存包装类
中间操作全程保持原始类型语义
所有 map、filter、reduce 等操作,都应基于原始值展开:
- 用
map(i -> i * 2)(输入输出都是int),别写map(x -> x * 2)在Stream<Integer>上——后者每次都要拆箱再装箱 - 过滤用
filter(i -> i % 2 == 0),对应接口是IntPredicate,不是Predicate<Integer> - 归约求和直接调
sum(),返回int;若用Stream<Integer>.reduce(0, Integer::sum),内部仍反复拆箱
聚合结果不引入新包装对象
终端操作的返回值也应是原始类型或其自然封装,避免无谓包装:
立即学习“Java免费学习笔记(深入)”;
-
IntStream.sum()返回int,max()返回OptionalInt(轻量结构,非Optional<Integer>) -
average()返回OptionalDouble,不是Optional<Double> - 需要默认值时用
orElse(0)直接得int,别用orElseGet(() -> 0)在包装类流里兜圈
配套工具链也要同步切换
光换流不够,上下游结构也得匹配原始类型习惯:
- 函数式接口选
ToIntFunction、IntConsumer、IntUnaryOperator,而非泛型版 - 集合存储优先用
int[]、fastutil.IntArrayList或Eclipse Collections IntList,避开List<Integer> - 金额、精度敏感场景禁用
DoubleStream,改用BigDecimal配合自定义流处理逻辑


















