IntStream.range()生成左闭右开整数区间流,支持惰性求值与函数式操作。它适用于遍历、映射、过滤、约简等场景,需注意边界方向、int溢出及避免副作用。

IntStream.range() 是 Java 8 引入的函数式工具,能以声明式、无副作用的方式替代传统 for 循环,特别适合整数范围内的遍历与计算。它生成的是**左闭右开区间**(即包含起始值,不包含结束值),底层基于惰性求值,配合终端操作(如 forEach、map、reduce)可高效完成各类数值计算。
快速执行带索引的批量计算
比如对 0 到 9 的每个下标做平方并打印:
IntStream.range(0, 10)
.map(i -> i * i)
.forEach(System.out::println);相比 for (int i = 0; i ,代码更紧凑,且天然支持链式转换。注意:若需包含上界(如 0–10 全部含),改用 <code>IntStream.rangeClosed(0, 10)。
替代传统 for 实现累加或聚合
计算 1 到 100 的和,无需手动声明变量:
int sum = IntStream.range(1, 101).sum();- 更灵活时用
reduce:OptionalInt result = IntStream.range(1, 101).reduce((a, b) -> a + b); - 带初始值的约简:
int product = IntStream.rangeClosed(1, 5).reduce(1, (a, b) -> a * b); // 120
结合 filter 和 map 做条件计算
例如:求 10 到 50 中所有偶数的立方和:
long evenCubesSum = IntStream.range(10, 51)
.filter(n -> n % 2 == 0)
.mapToLong(n -> (long) n * n * n)
.sum();这种组合清晰表达了“范围→筛选→转换→聚合”的逻辑流,可读性强,也便于后续并行化(加 parallel() 即可)。
避免常见陷阱
- 区间方向错误:若 start ≥ end,
range(start, end)返回空流,不会报错但结果为 0 或空 —— 检查边界值是否符合预期。 - 溢出风险:
map中做乘法或幂运算时,int 可能溢出,建议必要时转为long(用mapToLong)或使用Math.multiplyExact捕获异常。 - 副作用慎用:在
forEach中修改外部变量(如 list.add())虽可行,但违背函数式原则;优先用collect构建新集合:List<integer> squares = IntStream.range(0, 5).mapToObj(i -> i*i).collect(Collectors.toList());</integer>
掌握 range 的区间语义和终端操作搭配,就能把多数数值循环任务写得更简洁、安全、易维护。


















