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();