maptolong 直接返回 longstream,而非 stream;它接收 tolongfunction 将元素映射为 long 值,适用于 stream 到原始 long 流的转换,不可与 map 混淆。

mapToLong 本身返回的就是 LongStream,不需要“转换”——它是 Stream<t></t> 的终端映射操作,直接生成原始类型 long 的流。
你可能遇到的困惑是:
- 想从普通
Stream<integer></integer>或Stream<string></string>等对象流,得到LongStream; - 或者误以为
mapToLong返回的是Stream<long></long>,其实不是。
✅ mapToLong 的作用就是生成 LongStream
它只能用在 Stream<t></t> 上,接收一个 ToLongFunction<t></t>,把每个元素映射为 long 值,结果直接是 LongStream:
Stream<integer> intStream = Stream.of(1, 2, 3); LongStream longStream = intStream.mapToLong(i -> i.longValue()); // ✅ 直接得到 LongStream</integer>
注意:
-
i.longValue()是Integer→long的拆箱(安全); - 不能写
i -> (long) i(虽然编译通过,但不推荐,语义不清); - 也不能写
i -> Long.valueOf(i)—— 这返回Long对象,类型不匹配,编译报错。
⚠️ 常见错误:和 map + boxed 混淆
下面这段代码得到的是 Stream<long></long>,不是 LongStream:
Stream<integer> s = Stream.of(1, 2, 3); Stream<long> longObjStream = s.map(i -> (long) i); // ❌ 得到的是 Stream<long></long></long></integer>
如果后续想用 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</long> -
从 Stream
转 LongStream? Stream<long> objStream = Stream.of(1L, 2L, 3L); LongStream primStream = objStream.mapToLong(Long::longValue); // ✅ 必须手动拆箱</long>
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











