Arrays.setAll是Java 8引入的函数式数组初始化方法,通过IntUnaryOperator按索引生成值,一行代码即可构建自然数、奇偶数、等差数列等阶梯式数组。

Arrays.setAll 是 Java 8 引入的便捷方法,能通过一个基于索引的函数式接口(IntUnaryOperator)为数组每个位置“按需生成”值。构建阶梯式数组(如 [0, 1, 2, 3]、[2, 4, 6, 8]、[1, 3, 5, 7] 等)正是它的典型用武之地——无需循环,一行代码即可完成初始化。
理解 setAll 的参数逻辑
调用形式为:Arrays.setAll(array, generator),其中:
-
array:目标数组(必须已创建,长度确定); -
generator:类型为IntUnaryOperator的函数,接收当前索引i,返回该位置应填入的值。
关键点:索引 i 从 0 开始,依次为 0, 1, 2, ..., length−1。所有“阶梯”规律都围绕这个 i 展开。
常见阶梯模式的写法示例
假设要创建长度为 5 的数组:
立即学习“Java免费学习笔记(深入)”;
-
自然数序列(0 起始):
Arrays.setAll(arr, i -> i);→ [0, 1, 2, 3, 4] -
自然数序列(1 起始):
Arrays.setAll(arr, i -> i + 1);→ [1, 2, 3, 4, 5] -
偶数序列(从 0 开始):
Arrays.setAll(arr, i -> i * 2);→ [0, 2, 4, 6, 8] -
奇数序列(从 1 开始):
Arrays.setAll(arr, i -> i * 2 + 1);→ [1, 3, 5, 7, 9] -
等差数列(首项 a,公差 d):
Arrays.setAll(arr, i -> a + i * d);,例如 a=10, d=3 → [10, 13, 16, 19, 22]
配合 lambda 实现更灵活的阶梯逻辑
不只是线性表达式,任何基于索引的计算都可嵌入:
-
平方序列:
Arrays.setAll(arr, i -> i * i);→ [0, 1, 4, 9, 16] -
从大到小递减:
Arrays.setAll(arr, i -> arr.length - 1 - i);→ [4, 3, 2, 1, 0] -
自定义起始与步长混合:
Arrays.setAll(arr, i -> 100 + i * 5 - i % 2);(每步+5,偶数位再−1)
注意:lambda 中可访问外部变量(如 final 或 effectively final 的局部变量),便于动态传参。
完整可运行示例
// 创建长度为 6 的 int 数组,填充 3 的倍数:0, 3, 6, 9, 12, 15
int[] multiplesOfThree = new int[6];<br> Arrays.setAll(multiplesOfThree, i -> i * 3);<br> System.out.println(Arrays.toString(multiplesOfThree)); // [0, 3, 6, 9, 12, 15]
同样适用于 double[]、long[] 等基本类型数组(对应重载方法),也支持引用类型(用 Arrays.setAll(T[], IntFunction<T>))。


















