Since Java 8 instead of
for (int i = 0; i < results.length; i++) results[i] = generate();
you can use
Arrays.setAll(results, i -> generate());
You can also remove explicitly generating new Result[length] and let it be handled by stream
return IntStream.range(0, length).mapToObj(i->generate()).toArray(Result[]::new);
or probably more readable (but as Brian Goetz mentioned: with worse parallel performance compared to range version)
return Stream.generate(this::generate).limit(length).toArray(Result[]::new);
But don't confuse setAll(array, generator) with fill(array, element) method. fill will fill entire array with single element you passed while setAll will use generator to generate new element for each index in array.
Example:
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));
}
Output:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
return IntStream.range(0, length).mapToObj(i -> generate()).toArray(Result[]::new);. Whether it is more readable/elegant or not is up to the reader.