Java中IntStream生成区间数值需区分range(左闭右开)与rangeClosed(两端包含),如1~10应选rangeClosed(1,10);遍历下标用range(0,arr.length),转List需boxed(),无限流须limit截断。

Java 中用 IntStream 生成区间数值,核心就两点:选对方法(range 还是 rangeClosed),注意边界是否包含。
区分 range 和 rangeClosed
Java 的数值流默认采用「左闭右开」约定,这点和传统 for 循环习惯一致:
-
IntStream.range(start, end):生成从 start 到 end−1 的整数,不包含 end -
IntStream.rangeClosed(start, end):生成从 start 到 end 的整数,包含两端
比如要得到 1~10 共 10 个数:IntStream.range(1, 11) 或 IntStream.rangeClosed(1, 10) 都可以,但语义更清晰的是后者。
常见使用场景与写法
多数实际需求可直接套用固定模式:
-
遍历数组下标:用
IntStream.range(0, arr.length)—— 安全、简洁、不易越界 -
生成 1 到 n 的整数数组:用
IntStream.rangeClosed(1, n).toArray() -
构造测试数据或序列:配合
mapToObj转成对象流,例如循环取数组元素:IntStream.range(0, 8).mapToObj(i -> letters[i % letters.length])
注意基本类型流的转换限制
IntStream 是原始类型流,不能直接收集为 List<Integer> 或参与泛型操作:
立即学习“Java免费学习笔记(深入)”;
- 需要转对象流时,必须显式调用
mapToObj(i -> ...) - 若只需装箱成
List<Integer>,可用boxed().collect(Collectors.toList()) - 避免直接在
IntStream上调用collect(Collectors.toList()),会编译报错
别混淆无限流和范围流
range 系列生成的是有限、确定长度的流;而 Random.ints() 或 Stream.iterate() 才是无限流,需用 limit() 截断:
- ✅ 正确:
IntStream.range(1, 6).forEach(...) - ⚠️ 错误(无终止):
IntStream.iterate(1, i -> i + 1).forEach(...)—— 不加limit会死循环


















