Arrays.setAll是Java 8引入的便捷方法,通过Lambda按索引“按需计算”赋值,要求数组已预先创建,第二个参数为接收索引并返回对应值的函数式接口,支持整型、字符串及对象数组初始化。

Arrays.setAll 是 Java 8 引入的便捷方法,用于通过 Lambda 表达式为数组每个位置“按需计算”赋值,避免手动循环,代码更简洁、语义更清晰。
理解 setAll 的参数签名
该方法定义为:
public static
或对基本类型(如 int):
public static void setAll(int[] array, IntUnaryOperator generator)
关键点:
• 第一个参数是待初始化的数组(必须已创建,不能为 null)
• 第二个参数是一个函数式接口,接收当前索引 i,返回该位置应赋的值
• 函数体中可任意使用索引 i 进行计算(如 i*2、Math.pow(2,i)、new String("item"+i) 等)
常见用法示例
初始化整数数组(索引相关值):
int[] arr = new int[5];
Arrays.setAll(arr, i -> i * i); // [0, 1, 4, 9, 16]
初始化字符串数组(构造动态内容):
String[] names = new String[3];
Arrays.setAll(names, i -> "User" + (i + 1)); // ["User1", "User2", "User3"]
初始化对象数组(调用构造器或工厂方法):
LocalDateTime[] times = new LocalDateTime[2];
Arrays.setAll(times, i -> LocalDateTime.now().plusDays(i));
注意事项与避坑点
• 数组必须预先分配空间,setAll 不会创建新数组,只填充已有元素
• Lambda 中不要修改外部变量(除非是 final 或实际不可变),避免并发或意外状态
• 对于大型数组,确保生成逻辑高效;若涉及复杂计算或 I/O,需评估性能影响
• 基本类型数组(int[]、double[] 等)使用对应重载版本,避免装箱开销
对比传统 for 循环
传统写法:
int[] a = new int[4];
for (int i = 0; i
a[i] = i * 10;
}
Lambda 写法更紧凑,意图更明确,且天然支持并行化(如配合 Arrays.parallelSetAll 处理大数据量)


















