mapToLong 直接返回 LongStream,而非 Stream<Long>;它接收 ToLongFunction<T> 将元素映射为 long 值,适用于 Stream<T> 到原始 long 流的转换,不可与 map 混淆。

mapToLong 本身返回的就是 LongStream,不需要“转换”——它是 Stream<T> 的终端映射操作,直接生成原始类型 long 的流。
你可能遇到的困惑是:
- 想从普通
Stream<Integer>或Stream<String>等对象流,得到LongStream; - 或者误以为
mapToLong返回的是Stream<Long>,其实不是。
✅ mapToLong 的作用就是生成 LongStream
它只能用在 Stream<T> 上,接收一个 ToLongFunction<T>,把每个元素映射为 long 值,结果直接是 LongStream:
Stream<Integer> intStream = Stream.of(1, 2, 3); LongStream longStream = intStream.mapToLong(i -> i.longValue()); // ✅ 直接得到 LongStream
注意:
立即学习“Java免费学习笔记(深入)”;
-
i.longValue()是Integer→long的拆箱(安全); - 不能写
i -> (long) i(虽然编译通过,但不推荐,语义不清); - 也不能写
i -> Long.valueOf(i)—— 这返回Long对象,类型不匹配,编译报错。
⚠️ 常见错误:和 map + boxed 混淆
下面这段代码得到的是 Stream<Long>,不是 LongStream:
Stream<Integer> s = Stream.of(1, 2, 3); Stream<Long> longObjStream = s.map(i -> (long) i); // ❌ 得到的是 Stream<Long>
如果后续想用 LongStream 特有方法(如 sum()、average()、range()),必须用 mapToLong:
long sum = s.mapToLong(i -> i).sum(); // ✅ 正确,返回 long
? 其他获取 LongStream 的方式
-
直接构造原始流:
LongStream.range(0, 5); // [0, 1, 2, 3, 4] LongStream.of(10L, 20L, 30L); // 显式 long 字面量
-
从数组生成:
long[] arr = {1L, 2L, 3L}; LongStream stream = Arrays.stream(arr); // ✅ 不是 Stream<long[]>,而是 LongStream -
从 Stream
转 LongStream? Stream<Long> objStream = Stream.of(1L, 2L, 3L); LongStream primStream = objStream.mapToLong(Long::longValue); // ✅ 必须手动拆箱
不复杂但容易忽略


















