Existe-t-il un moyen de remplir un tableau à l'aide de Java 8 Supplier
?
J'aimerais écrire:
Supplier<Object> supplier = () -> new Object();
Object[] array = new Object[size];
Arrays.fill(array, supplier);
Note: Je sais que je pourrais écrire ma propre méthode.
Si vous souhaitezcompléter un tableau déjà existantavec les données du fournisseur, voir answer posté par Stuart Marks , ou utilisez création _ solution de @ Hogler'scommentaire :
Arrays.asList(array).replaceAll(x -> supplier.get());
//you can even overwrite a range using `subList`
Si vous n’avez aucun problème aveccréation d’un nouveau tableaurempli avec les résultats générés par le fournisseur, vous pouvez utiliser
Object[] array = Stream.generate(supplier).limit(arraySize).toArray();
// will return new array ^^^^^^^
Pour des types autres que Object
, vous pouvez utiliser toArray(IntFunction<YourType[]> generator);
comme toArray(YourType[]::new)
( attribue de nouveau à@Holger ).
String[] array = Stream.generate(supplier).limit(10).toArray(String[]::new);
Dans Java.util.Arrays
il y a
<T> void Arrays.setAll(T[] array, IntFunction<T> generator)
Cela ne prend pas un fournisseur; à la place, il prend une variable IntFunction
dont l'argument d'entrée est l'index de tableau en cours de remplissage. Si vos objets ne dépendent pas de l'index du tableau de destination, vous pouvez ignorer le paramètre et appeler un fournisseur de la manière suivante:
Arrays.setAll(array, i -> supplier.get());
Il existe des surcharges pour les tableaux de primitives ainsi que pour les tableaux de type référence. Il existe également une famille correspondante de méthodes parallelSetAll()
qui fait la même chose, sauf en parallèle. (Il utilise des flux en interne.)
Vous pouvez facilement écrire le vôtre:
public static <T> void fillArray(T[] array, Supplier<? extends T> supplier) {
for(int k = 0; k < array.length; k++)
array[k] = supplier.get();
}