Stream.iterate()可构造等差数列流:传入起始值和“加步长”函数,再用limit()限定长度;可封装为arithmeticSequence方法支持复用;需注意溢出风险与limit位置,过滤应在limit后以提升效率。

可以用 Stream.iterate() 从起始值开始,按固定步长不断生成后续元素,再用 limit() 控制序列长度,轻松构造等差数列流。
基础写法:起始值 + 步长函数
Stream.iterate() 接收两个参数:初始值和一个前一项 → 后一项的函数。对等差数列来说,这个函数就是「加步长」。
例如,生成从 3 开始、步长为 5、共 6 个数的序列:
Stream.iterate(3, n -> n + 5)
.limit(6)
.forEach(System.out::println);
输出:3, 8, 13, 18, 23, 28
封装成可复用的方法
把起始值、步长、数量抽成参数,便于多次调用:
public static LongStream arithmeticSequence(long start, long step, long count) {
return Stream.iterate(start, n -> n + step)
.limit(count)
.mapToLong(Long::longValue);
}
使用示例:
arithmeticSequence(10, -3, 4).forEach(System.out::println); // 10, 7, 4, 1
注意边界与类型安全
- 步长可正可负,但需确保不会因溢出导致无限循环(如
Integer.MAX_VALUE + 1回绕) - 若需处理大数,建议用
BigInteger配合Stream<biginteger></biginteger> -
limit(n)必须在iterate()之后立即调用,否则流可能无限执行(iterate默认不终止)
扩展:生成带条件的序列(如只取偶数步长结果)
可在 limit() 后接 filter(),但注意顺序:先限长再过滤更高效。
Stream.iterate(0, n -> n + 7)
.limit(10)
.filter(n -> n % 2 == 0)
.forEach(System.out::println); // 0, 14, 28, 42, 56


















