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 索引处理技巧


原始标题:Java IntStream Conversions