arrays.setall是java 8引入的通过lambda按索引初始化数组的方法,接收数组和intunaryoperator函数,不创建数组仅填充,适用于原始类型、字符串及对象数组。

Arrays.setAll 是 Java 8 引入的便捷方法,用于通过 lambda 表达式按索引初始化数组,替代传统 for 循环,代码更简洁、语义更清晰。
基本用法:用索引生成元素值
它接收一个数组和一个 IntUnaryOperator(即 int → T 的函数),对每个下标 i 调用该函数,将返回值赋给 array[i]。
例如初始化一个长度为 5 的整数数组,存入平方值:
int[] squares = new int[5];Arrays.setAll(squares, i -> i * i);
// 结果:[0, 1, 4, 9, 16]
配合 Stream.iterate 或其他工厂逻辑(需先创建数组)
setAll 本身不创建数组,只填充。若想“一行初始化”,需组合 new Type[size]:
- 字符串数组:按索引生成 "item-0", "item-1"...
- String[] items = new String[3];
Arrays.setAll(items, i -> "item-" + i); - 对象数组(如自定义类):User[] users = new User[4];
Arrays.setAll(users, i -> new User("u" + i));
对比传统写法与常见误区
不用 setAll 时通常写:
for (int i = 0; i arr[i] = i * 2;
}
而 setAll 更直接表达“每个位置由其下标决定”的意图。注意两点:
- 不能用于基本类型数组的“空构造”(如
int[] a = Arrays.setAll(...)不成立,因无静态泛型重载) - 对引用类型数组,lambda 中 new 出的对象不会共享引用——每次调用都新建实例
替代方案:Stream 生成(适合不可变或一次性场景)
如果不需要原地修改已有数组,而是想“生成并收集”,可用:
Integer[] boxed = IntStream.range(0, 5).mapToObj(i -> i * i)
.toArray(Integer[]::new);
但注意这是装箱后的引用数组;若需原始 int[],仍得用 IntStream.toArray(),无需 setAll。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











