2015-06-27 6 views
0

Как я могу сгенерировать массив указанной длины методом?Array, сгенерированный методом

Короче говоря, что элегантная замена этого кода:

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; 
} 
+0

Что вам не нравится в этом решении? Довольно и аккуратно. –

+0

это хорошее решение ... – Proxytype

+1

С Java 8: 'return IntStream.range (0, length) .mapToObj (i -> generate()). ToArray (Результат [] :: new);'. Является ли это более читаемым/элегантным или нет, зависит от читателя. –

ответ

4

Поскольку 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] 
+0

Ваше первое предложение - лучшее, на мой взгляд. –

+1

@RedRoboHood Мне тоже нравится, но я не уверен, какой подход ищет OP, поэтому я добавил еще несколько вариантов. – Pshemo

+0

Отличный ответ, спасибо! – MaKri

Смежные вопросы