IntStream.range()生成左闭右开整数流,rangeClosed()生成左右闭合整数流;前者如range(1,5)得1,2,3,4,后者如rangeClosed(1,5)得1,2,3,4,5,均步长为1且不支持递减。

Java Stream API 提供了 IntStream.range() 和 IntStream.rangeClosed() 两个静态方法,专门用于生成有序的整数流,区别在于是否包含结束值。
range:生成左闭右开的整数流
IntStream.range(startInclusive, endExclusive) 从 包含 起始值开始,到 不包含 结束值为止,步长固定为 1。适用于需要“前 N 个数”或“索引遍历”的场景。
- 若 start ≥ end,结果为空流(不会抛异常)
- 只支持 int 类型;如需 long 或其他类型,需自行映射或使用 LongStream.range()(JDK 9+)
- 示例:
IntStream.range(1, 5)→ 流中元素为 1, 2, 3, 4
rangeClosed:生成左右都闭的整数流
IntStream.rangeClosed(startInclusive, endInclusive) 从起始值到结束值(两者都包含),同样步长为 1。适合明确要包含末尾数字的情况,比如生成 1 到 10 的自然数。
- 若 start > end,结果为空流
- 注意:JDK 8 引入了
rangeClosed,但早期版本不支持,需确认 JDK 版本 - 示例:
IntStream.rangeClosed(1, 5)→ 流中元素为 1, 2, 3, 4, 5
常见用法与注意事项
两者返回的都是 IntStream,可链式调用 filter、map、forEach 等操作。实际使用时需注意边界和类型限制。
立即学习“Java免费学习笔记(深入)”;
- 不能直接生成递减序列(如 5→1),需配合
boxed().sorted(Comparator.reverseOrder())或手动构造 - 若需步长不为 1(如偶数序列),可用
range+filter(n -> n % 2 == 0),或用iterate+limit - 避免在 range 参数中使用非常大的数值(如
Integer.MAX_VALUE),防止内存或性能问题
简单对比示例
以下代码直观展示差异:
IntStream.range(3, 6).forEach(System.out::print); // 输出:345<br> IntStream.rangeClosed(3, 6).forEach(System.out::print); // 输出:3456


















