IntStream、LongStream、DoubleStream是Java 8中专为int、long、double设计的特化流,避免装箱拆箱,性能更高、GC压力更小;需按数据语义选择:计数用IntStream,大整数用LongStream,浮点计算用DoubleStream,但金额运算禁用DoubleStream。

Java 8 引入的 Stream API 中,IntStream、LongStream 和 DoubleStream 是专为基本数值类型设计的特化流,它们不装箱、不拆箱,性能比泛型 Stream<Integer> 等高得多。用对场景,能显著减少 GC 压力和计算开销。
为什么不用 Stream<Integer> 而要用 IntStream?
因为 Stream<Integer> 每次运算(如 map、sum)都要自动装箱/拆箱,频繁操作小整数时性能损耗明显。而 IntStream 直接在 int 值上运算,内存连续、CPU 缓存友好。
- 例如:对一百万个整数求和,
IntStream.sum()比stream.mapToInt(i -> i).sum()(已转为 IntStream)快约 2–3 倍;若用Stream<Integer>.mapToInt(Integer::intValue).sum(),额外装箱成本更不可忽视 -
LongStream和DoubleStream同理,分别对应 long 和 double 的原生计算需求 - 三者都继承自
BaseStream,但不实现Stream接口,不能直接混用——必须显式转换
怎么创建和使用数值流?
常见创建方式简洁直接,适合不同数据源:
-
从数组:
IntStream.of(1, 2, 3)或IntStream.range(0, 10)(左闭右开)、IntStream.rangeClosed(1, 10)(含两端) -
从集合:需先转为基本类型数组,再调用
IntStream.of(arr);或用list.stream().mapToInt(Integer::intValue) -
生成序列:
LongStream.iterate(0L, i -> i + 2).limit(5)得到 0,2,4,6,8;DoubleStream.generate(Math::random).limit(3)生成三个随机 double
常用操作与注意事项
数值流支持聚合、遍历、统计等核心能力,但方法名和返回值类型有约定:
立即学习“Java免费学习笔记(深入)”;
- 过滤、映射、排序:用
filter、map、sorted—— 返回同类型数值流(如IntStream.filter(...).map(...)) - 终端统计:
sum()、average()(返回OptionalDouble)、max()/min()(返回OptionalInt)、count()(返回long) - 转回对象流:用
boxed(),例如IntStream.range(1,4).boxed().collect(Collectors.toList())→[1,2,3] - 注意空流:
average()、max()等可能返回空Optional,务必用orElse(...)或orElseThrow()处理
什么时候该选哪个数值流?
按数据语义和范围选择,避免隐式溢出或精度丢失:
- 计数、索引、小范围整数(如状态码、枚举序号)→ 用
IntStream(32 位,±21 亿内安全) - 大数量级 ID、时间戳、文件大小 → 用
LongStream(64 位,推荐处理超过Integer.MAX_VALUE的整数) - 科学计算、浮点统计(均值、标准差)→ 用
DoubleStream;注意它不保证完全精确,但比Stream<BigDecimal>快得多 - 不要用
DoubleStream做金额运算——仍应坚持BigDecimal+ 手动流处理


















