java中intstream通过range()(左闭右开)和rangeclosed()(左闭右闭)生成整数序列,前者适用于索引遍历如range(1,6)得1~5,后者更符合自然描述如rangeclosed(1,5)直接得1~5,均只升序生成,需注意int溢出及流不可重用。

Java 中用 IntStream 生成指定范围的数字序列非常简洁,核心是使用 range() 和 rangeClosed() 两个静态方法。
range(startInclusive, endExclusive):生成左闭右开区间
这个方法生成从 startInclusive(包含)到 endExclusive(不包含)之间的整数流,步长为 1。
- 适用于常规循环场景,比如遍历索引
0到n-1 - 如果想生成
1, 2, 3, 4, 5,应写IntStream.range(1, 6) - 若起始值 ≥ 结束值,流为空(不会抛异常)
rangeClosed(startInclusive, endInclusive):生成左闭右闭区间
这个方法生成从 startInclusive 到 endInclusive(都包含)的整数流。
- 更符合“生成 1 到 10”这类自然语言描述
- 生成
1, 2, 3, 4, 5直接写IntStream.rangeClosed(1, 5) - 同样支持逆序?不支持——它只升序生成;如需降序,得配合
boxed().sorted(Collections.reverseOrder())或手动构造
常见实用写法示例
可以直接终端操作输出,也可收集为数组或列表:
- 打印 1~10:
IntStream.rangeClosed(1, 10).forEach(System.out::println); - 转成 int 数组:
int[] arr = IntStream.range(0, 5).toArray(); // [0,1,2,3,4] - 转成 Integer 列表(需装箱):
List<integer> list = IntStream.rangeClosed(1, 3).boxed().collect(Collectors.toList()); // [1,2,3]</integer>
注意边界与类型安全
IntStream 只处理 int 类型,不自动提升为 long。若范围超出 int 表达能力(如 Integer.MAX_VALUE + 1),会溢出导致意外结果。
- 大范围且需精确时,改用
LongStream.range() - 避免在
range参数中直接写可能溢出的表达式,比如IntStream.range(a, a + n)要确保a + n ≤ Integer.MAX_VALUE - 流一旦创建,不可重复使用;多次消费需重新生成
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











