maptoint将stream转为intstream,maptoobj将intstream转回stream;前者需tointfunction,后者需intfunction,二者配合实现高效数值处理与对象流转换。

Java 中 mapToInt 和 mapToObj 是用于在不同流类型间转换的中间操作,它们不改变数据本身,而是改变流的“容器类型”——从 Stream<t></t> 切换到原始类型流(如 IntStream),或反过来。
mapToInt:转成 IntStream
它把一个对象流(Stream<t></t>)中每个元素映射为一个 int 值,返回 IntStream。适用于需要后续做数值聚合、范围操作或避免装箱开销的场景。
常见用法:
- 必须传入
ToIntFunction<t></t>,即接受一个泛型对象、返回int的函数 - 不能返回
null或包装类(如Integer),否则编译不通过 - 原始值流(如
IntStream)不能直接调用mapToInt,它只定义在Stream上
示例:
Stream<string> stringStream = Stream.of("1", "2", "3");
IntStream intStream = stringStream.mapToInt(Integer::parseInt); // ✅ 正确
// intStream.mapToInt(x -> x); // ❌ 编译错误:IntStream 没有 mapToInt 方法</string>
mapToObj:转回 Stream
它把原始类型流(如 IntStream)中的每个原始值映射为一个对象,返回 Stream<t></t>。常用于在数值计算后恢复为对象流,以便调用 filter、map、collect 等通用流操作。
关键点:
- 只定义在原始流上(
IntStream、LongStream、DoubleStream) - 参数是
IntFunction<r></r>(对IntStream而言),接收int,返回任意引用类型 - 可用来“升箱”,比如把
int转成String、Integer或自定义对象
示例:
IntStream range = IntStream.range(1, 4); Stream<string> strStream = range.mapToObj(String::valueOf); // "1", "2", "3" Stream<integer> boxed = range.mapToObj(Integer::valueOf); // 等价于 range.boxed()</integer></string>
常见转换组合与注意事项
实际开发中,二者常配合使用,形成“对象 → 原始 → 对象”的链式处理:
Stream<string> → mapToInt → IntStream → filter/sum/average → mapToObj → Stream<string></string></string>-
boxed()是IntStream.mapToObj(Integer::valueOf)的简写,但语义更清晰;而mapToObj更灵活,支持任意目标类型 - 不要混淆
mapToObj和map:后者在Stream上使用,不能直接处理原始值;前者专为原始流转对象流设计 - 类型一旦转换,就不能再调用原流的方法:比如
IntStream没有map,Stream也没有sum
为什么不直接用 map 处理 int?
因为 Stream<integer></integer> 中的 map 返回仍是 Stream>,涉及自动装箱/拆箱,性能差且无法使用 IntStream 特有方法(如 range、summaryStatistics)。用 mapToInt 可绕过对象创建,提升数值密集型操作效率。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











