Java 8 заполняет массив поставщиком

Есть ли способ заполнить массив, используя java 8 Supplier?

Я бы хотел написать:

Supplier<Object> supplier = () -> new Object();
Object[] array = new Object[size];
Arrays.fill(array, supplier);

Примечание: Я знаю, что могу написать свой собственный метод.

Ответы

Ответ 1

В случае, если вы хотите заполнить уже существующий массив данными от поставщика, посмотрите ответ, опубликованный Стюартом Марксом, или используйте креативное решение из комментария @Hogler:

Arrays.asList(array).replaceAll(x -> supplier.get()); 
//you can even overwrite a range using 'subList'

Если у вас нет проблем с созданием нового массива, заполненного результатами, сгенерированными поставщиком, вы можете использовать

Object[] array = Stream.generate(supplier).limit(arraySize).toArray();
//                                    will return new array ^^^^^^^ 

Для типов, отличных от Object вы можете использовать toArray(IntFunction<YourType[]> generator); например toArray(YourType[]::new) (снова зачисляется на @Holger).

String[] array  = Stream.generate(supplier).limit(10).toArray(String[]::new);

Ответ 2

В java.util.Arrays есть

<T> void Arrays.setAll(T[] array, IntFunction<T> generator)

Это не принимает поставщика; вместо этого он принимает IntFunction, входной аргумент которого заполняется индексом массива. Если ваши объекты не зависят от индекса целевого массива, вы можете игнорировать параметр и вызвать поставщика следующим образом:

Arrays.setAll(array, i -> supplier.get());

Существуют перегрузки для массивов примитивов, а также массивы ссылочного типа. Существует также соответствующее семейство методов parallelSetAll(), которое делает то же самое, кроме как параллельно. (Он использует потоки внутри.)

Ответ 3

Вы можете легко написать свой собственный:

public static <T> void fillArray(T[] array, Supplier<? extends T> supplier) {
    for(int k = 0; k < array.length; k++)
        array[k] = supplier.get();
}

Ответ 4

Альтернатива решению Pshemo вы можете использовать метод карты.

Object[] array = new Object[size];
array = Arrays.stream(array).map(a -> new Object()).toArray();