arrays.setall 是 java 8 提供的根据索引动态填充一维数组的便捷方法,支持基本类型和引用类型,分别使用 intunaryoperator、inttodoublefunction 等函数接口,要求数组非 null 且 lambda 不返回 null。

Arrays.setAll 是 Java 8 引入的便捷方法,用于**根据索引动态计算每个元素的值并填充数组**,无需手动写循环。它适用于任何一维数组(基本类型或引用类型),核心是传入一个函数式接口 IntUnaryOperator(对 int[])或 IntFunction<t></t>(对引用类型数组),该函数接收当前索引,返回对应位置要填的值。
基本用法:按索引生成值
最常见场景是根据下标计算元素,比如填充平方数、阶乘、斐波那契项等:
- 填充
int[]:用IntUnaryOperator,参数是index,返回int - 填充
String[]或自定义对象数组:用IntFunction<t></t>,参数是index,返回对应类型的实例
示例:生成前 5 个偶数(0, 2, 4, 6, 8)
int[] arr = new int[5];Arrays.setAll(arr, i -> i * 2); // i 是索引 0~4
支持所有基本类型数组
Java 为每种基本类型数组都提供了对应的重载版本(如 setAll(int[], ...)、setAll(double[], ...) 等),内部自动适配函数类型:
-
int[]→IntUnaryOperator -
double[]→IntToDoubleFunction -
long[]→IntToLongFunction -
boolean[]→IntPredicate(返回 boolean)
示例:生成 1.1, 2.2, 3.3…
Arrays.setAll(dArr, i -> (i + 1) * 1.1); // 索引 0→1.1, 1→2.2, 2→3.3
引用类型数组:灵活构造对象
对 String[]、List[] 或自定义类数组,使用 IntFunction<t></t>,可在每次调用时 new 实例或调用静态工厂方法:
- 适合初始化不可变对象或带参数的构造
- 避免重复 new 同一对象(注意:每个索引独立调用,不会复用)
示例:创建 3 个不同内容的字符串
String[] strs = new String[3];Arrays.setAll(strs, i -> "Item-" + (i + 1)); // ["Item-1", "Item-2", "Item-3"]
注意事项和常见误区
这个方法简洁但有边界条件需留意:
- 数组必须已创建且非 null,否则抛
NullPointerException - 函数不能返回 null(对引用类型数组),否则运行时抛
NullPointerException - 不支持多维数组——只能作用于一维数组,二维需嵌套调用
- 函数执行顺序是按索引从 0 到 length−1,但无并发安全保证,不要在 lambda 中修改共享状态
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











