1. IntStream 转换概述
Java 8 引入了 Stream API,极大简化了集合和数组的操作。其中,IntStream
是一个专门处理 int
类型的原始类型流,常用于处理数字序列。但在实际开发中,我们经常需要将 IntStream
转换为数组、列表、字符串等常见类型。
本文将通过简洁明了的示例,讲解如何将 IntStream
转换为 int[]
、List<Integer>
和 String
,并附带踩坑提醒和最佳实践,帮助你快速掌握转换技巧。
2. IntStream 转 int[]
将 IntStream
转换为 int[]
是最直接的场景之一。Java 原生支持通过 toArray()
方法完成转换,非常高效。
✅ 示例:生成前 50 个偶数并转为数组
@Test
public void intStreamToArray() {
int[] first50EvenNumbers = IntStream.iterate(0, i -> i + 2)
.limit(50)
.toArray();
assertThat(first50EvenNumbers).hasSize(50);
assertThat(first50EvenNumbers[2]).isEqualTo(4);
}
📌 说明:
IntStream.iterate(0, i -> i + 2)
:生成从 0 开始的无限偶数流。.limit(50)
:限制流长度,只取前 50 个元素。.toArray()
:直接转为int[]
,高效简洁。
⚠️ 踩坑提醒:
不要忘记加 .limit()
,否则会无限执行下去,导致程序卡死。
3. IntStream 转 List
由于 IntStream
是原始类型流,不能直接收集为 List<Integer>
,需要先进行装箱(boxing)操作。
✅ 示例:使用 range()
生成 0~49 的整数并转为列表
@Test
public void intStreamToList() {
List<Integer> first50IntegerNumbers = IntStream.range(0, 50)
.boxed()
.collect(Collectors.toList());
assertThat(first50IntegerNumbers).hasSize(50);
assertThat(first50IntegerNumbers.get(2)).isEqualTo(2);
}
📌 说明:
IntStream.range(0, 50)
:生成从 0 到 49 的整数流(不包含 50)。.boxed()
:将int
转换为Integer
,这是转换为List<Integer>
的关键一步。.collect(Collectors.toList())
:将流收集为列表。
📌 小技巧:
如果你只需要 Integer[]
,可以使用 .toArray(Integer[]::new)
替代。
4. IntStream 转 String
将 IntStream
转换为字符串的常见做法是先将其映射为 Stream<String>
,然后使用 Collectors.joining()
拼接字符串。
✅ 示例:将前 3 个数字拼接为字符串
@Test
public void intStreamToString() {
String first3numbers = IntStream.of(0, 1, 2)
.mapToObj(String::valueOf)
.collect(Collectors.joining(", ", "[", "]"));
assertThat(first3numbers).isEqualTo("[0, 1, 2]");
}
📌 说明:
IntStream.of(0, 1, 2)
:创建一个包含指定元素的流。.mapToObj(String::valueOf)
:将每个int
转换为String
。.joining(", ", "[", "]")
:用逗号连接,并添加前后缀,形成[0, 1, 2]
的格式。
📌 可选参数说明:
- 第一个参数:分隔符(如 ", ")
- 第二个参数:前缀(如 "[")
- 第三个参数:后缀(如 "]")
5. 总结
转换目标 | 方法说明 | 示例方法/操作符 |
---|---|---|
int[] |
使用 toArray() 直接转换 |
.toArray() |
List<Integer> |
先 .boxed() 再用 Collectors.toList() |
.boxed().collect(...) |
String |
使用 mapToObj 转为字符串流,再 joining |
.mapToObj(...).collect(...) |
💡 总结建议:
- 性能优先:
IntStream
是原始类型流,转换为int[]
最高效。 - 类型转换注意装箱:转换为
List<Integer>
必须使用.boxed()
。 - 字符串拼接灵活:使用
Collectors.joining()
可以灵活控制格式,适合日志、展示等场景。
📌 示例源码已托管在 GitHub:Java Stream 转换示例代码(模拟链接)
如需进一步了解 Java Stream API 的高级用法,可参考:Java 8 原始类型流详解 和 Stream 索引处理技巧