Поскольку 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);
или, возможно, более читаемым (но, как Brian Goetz упоминалось: с worse parallel performance по сравнению с range
версии)
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]
Что вам не нравится в этом решении? Довольно и аккуратно. –
это хорошее решение ... – Proxytype
С Java 8: 'return IntStream.range (0, length) .mapToObj (i -> generate()). ToArray (Результат [] :: new);'. Является ли это более читаемым/элегантным или нет, зависит от читателя. –