web-dev-qa-db-fra.com

Tableau de remplissage Java 8 avec le fournisseur

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.

22
gontard

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);
28
Pshemo

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.)

18
Stuart Marks

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();
}
0
immibis