必须用mapToDouble当数据含小数、需高精度或结果为浮点型,如价格、评分、温度;mapToInt适用于纯整型且大数据量场景,兼顾性能与内存,二者不可混用或硬转。

选对数值映射方法,不是为了炫技,而是避免溢出、精度丢失和空指针——mapToInt 和 mapToDouble 各有不可替代的适用边界。
什么时候必须用 mapToDouble
当原始数据含小数、需要高精度计算,或统计结果天然是浮点类型时,mapToDouble 是唯一合理选择。比如商品价格、用户评分、温度传感器读数等场景,用 mapToInt 会直接截断小数部分,导致平均值偏低、总和失真。
- 价格统计:Product::getPrice 返回 double,直接 mapToInt(Integer::intValue) 会丢掉 .99 部分
- 平均值计算:average() 返回 OptionalDouble,而 IntStream.average() 返回 OptionalDouble 但内部按 int 累加,精度受限
- 科学计算:涉及开方、对数、三角函数等操作,输入必须为 double 类型
mapToInt 的真实优势场景
它不是“整数专用版 map”,而是面向性能与语义清晰度的优化工具。适用于纯整型业务字段且数据量大时,比如用户年龄、订单编号、库存数量等。
- 内存节省:100 万整数用 IntStream 占约 4MB,用 Stream
占约 32MB - 运算提速:sum、max、min 等终端操作在原始类型流中无装箱开销,实测快 2–3 倍
- 防溢出提醒:IntStream.sum() 溢出时不抛异常,但可配合 reduce 用 Math.addExact 显式检查
空值与空集合的统一处理套路
mapToDouble 和 mapToInt 都不接受 null 元素,且空流的统计结果返回 empty Optional(如 OptionalDouble.empty),直接调用 getAsDouble() 或 getAsInt() 必抛异常。
立即学习“Java免费学习笔记(深入)”;
- 先 filter:.filter(obj -> obj.getValue() != null)
- 再转换:.mapToDouble(Obj::getValue)
- 最后安全取值:.average().orElse(0.0) 或 .sum()
- 若字段本身为包装类型(如 Integer/Double),可用 .mapToDouble(v -> v == null ? 0.0 : v.doubleValue()) 避免 NPE
别混用类型,也别硬转
mapToInt 不是“把一切转成 int”的快捷键。强行把 long ID 或 double 金额转 int,既损失精度又掩盖设计问题。
- ID 字段超 21 亿?该用 mapToLong,而非 (int) id 强转
- 金额字段单位是分?用 mapToInt 处理整数分值没问题;单位是元且含小数?必须 mapToDouble
- 不确定类型时,优先看字段定义:数据库里是 DECIMAL → Java 是 BigDecimal 或 double → 流中用 mapToDouble


















