longstream和doublestream是java 8专为long、double设计的原始数值流,避免装箱拆箱,性能高、gc压力小;不继承stream接口,需显式转换;常用创建方式包括range/rangeclosed、iterate、of及generate等,支持filter、map、sum等操作,但金额计算禁用doublestream以防精度误差。

LongStream 和 DoubleStream 是 Java 8 引入的原始数值流,专为 long 和 double 类型设计,避免装箱拆箱,性能高、GC 压力小。它们不继承 Stream 接口,不能直接和 Stream
怎么创建 LongStream
常用方式有三种:
-
范围生成:用
LongStream.range(0L, 10L)(左闭右开)或LongStream.rangeClosed(1L, 5L)(两端包含) -
迭代生成:如
LongStream.iterate(0L, n -> n + 3).limit(4)得到 0, 3, 6, 9 -
数组构造:
LongStream.of(100L, 200L, 300L),适合已知少量值
怎么创建 DoubleStream
DoubleStream 不提供原生 range 方法,但可通过 IntStream 转换或直接生成:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
从整数流映射:如
IntStream.range(0, 5).mapToDouble(i -> i * 1.5)→ 0.0, 1.5, 3.0, 4.5, 6.0 -
随机/常量生成:如
DoubleStream.generate(Math::random).limit(3)或DoubleStream.of(1.1, 2.2, 3.3) - 注意:金额类计算禁用 DoubleStream,浮点精度误差会导致业务错误,应改用 BigDecimal 或整数单位(如分)
常用操作与转换技巧
两者都支持 filter、map、sorted、forEach 等中间操作,返回同类型流;聚合方法如 sum()、max()、min()、average() 返回 Optional 类型(需判空):
-
转回包装类型集合:调用
.boxed().collect(Collectors.toList()),例如LongStream.of(1L,2L).boxed().collect(Collectors.toList()) - 转为普通 Stream:只能先 boxed,再使用;无法直接 mapToObj
-
并行处理:调用
parallel()即可,如LongStream.range(0, 1_000_000).parallel().sum()
典型误用提醒
几个容易踩坑的点:
- 把
DoubleStream.sum()用于财务计算——结果可能不精确,比如 0.1 + 0.2 ≠ 0.3 - 用
LongStream.range(0, Integer.MAX_VALUE + 1L)导致内存溢出——range 生成的是顺序序列,元素全在内存中,大数据量建议分段或用 iterate + limit 控制 - 误以为
Stream<long>.mapToLong(Long::longValue)</long>和LongStream性能一致——前者仍经历装箱过程,应优先从源头用 LongStream
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










