方法生成的数组
Array generated by a method
如何通过方法生成指定长度的数组?
简而言之,什么是此代码的优雅替换:
Result generate() {
// logic
}
Result[] results(int length) {
Result[] results = new Result[length];
for (int i = 0; i < results.length; i++) results[i] = generate();
return results;
}
因为 Java 8 而不是
for (int i = 0; i < results.length; i++) results[i] = generate();
你可以使用
Arrays.setAll(results, i -> generate());
您也可以删除显式生成 new Result[length]
并让它由流处理
return IntStream.range(0, length).mapToObj(i->generate()).toArray(Result[]::new);
或可能更具可读性(但与 range
版本相比 Brian Goetz mentioned: with worse parallel performance)
return Stream.generate(this::generate).limit(length).toArray(Result[]::new);
但不要将 setAll(array, generator)
与 fill(array, element)
方法混淆。 fill
将用您传递的单个元素填充整个数组,而 setAll
将使用生成器为数组中的每个索引生成新元素。
示例:
static AtomicInteger ai = new AtomicInteger();
static int generate() {
return ai.incrementAndGet();
}
public static void main(String[] args) {
int[] result = new int[10];
Arrays.fill(result, generate());
System.out.println(Arrays.toString(result));
Arrays.setAll(result, i->generate());
System.out.println(Arrays.toString(result));
}
输出:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
如何通过方法生成指定长度的数组?
简而言之,什么是此代码的优雅替换:
Result generate() {
// logic
}
Result[] results(int length) {
Result[] results = new Result[length];
for (int i = 0; i < results.length; i++) results[i] = generate();
return results;
}
因为 Java 8 而不是
for (int i = 0; i < results.length; i++) results[i] = generate();
你可以使用
Arrays.setAll(results, i -> generate());
您也可以删除显式生成 new Result[length]
并让它由流处理
return IntStream.range(0, length).mapToObj(i->generate()).toArray(Result[]::new);
或可能更具可读性(但与 range
版本相比 Brian Goetz mentioned: with worse parallel performance)
return Stream.generate(this::generate).limit(length).toArray(Result[]::new);
但不要将 setAll(array, generator)
与 fill(array, element)
方法混淆。 fill
将用您传递的单个元素填充整个数组,而 setAll
将使用生成器为数组中的每个索引生成新元素。
示例:
static AtomicInteger ai = new AtomicInteger();
static int generate() {
return ai.incrementAndGet();
}
public static void main(String[] args) {
int[] result = new int[10];
Arrays.fill(result, generate());
System.out.println(Arrays.toString(result));
Arrays.setAll(result, i->generate());
System.out.println(Arrays.toString(result));
}
输出:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]