web-dev-qa-db-fra.com

Comment passer un ArrayList à un paramètre de méthode varargs?

En gros, j'ai une liste de tableaux de lieux:

ArrayList<WorldLocation> locations = new ArrayList<WorldLocation>();

ci-dessous, j'appelle la méthode suivante:

.getMap();

les paramètres de la méthode getMap () sont les suivants: 

getMap(WorldLocation... locations)

Le problème que je rencontre est que je ne sais pas comment passer de la liste entière de locations à cette méthode.

J'ai essayé

.getMap(locations.toArray())

mais getMap n'accepte pas cela parce qu'il n'accepte pas les objets [].

Maintenant si j'utilise

.getMap(locations.get(0));

cela fonctionnera parfaitement ... mais je dois passer d'une manière ou d'une autre dans TOUS les emplacements ... Je pourrais bien sûr continuer à ajouter locations.get(1), locations.get(2) etc. mais la taille du tableau varie. Je ne suis tout simplement pas habitué au concept entier de ArrayList

Quel serait le moyen le plus facile de s'y prendre? Je sens que je ne pense tout simplement pas droit maintenant.

168
MJ93

Utilisez la méthode toArray(T[] arr) .

.getMap(locations.toArray(new WorldLocation[locations.size()]))

(toArray(new WorldLocation[0]) fonctionne également, mais vous alloueriez un tableau de longueur nulle sans raison.)


Voici un exemple complet:

public static void method(String... strs) {
    for (String s : strs)
        System.out.println(s);
}

...
    List<String> strs = new ArrayList<String>();
    strs.add("hello");
    strs.add("wordld");

    method(strs.toArray(new String[strs.size()]));
    //     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...

Cet article a été réécrit sous forme d'article ici .

256
aioobe

En Java 8:

List<WorldLocation> locations = new ArrayList<>();

.getMap(locations.stream().toArray(WorldLocation[]::new));
21
jmhostalet

Une version abrégée de la réponse acceptée utilisant Guava:

.getMap(Iterables.toArray(locations, WorldLocation.class));

peut être raccourci en important statiquement dans toArray:

import static com.google.common.collect.toArray;
// ...

    .getMap(toArray(locations, WorldLocation.class));
7
tkruse

Vous pouvez faire: getMap(locations.toArray(new WorldLocation[locations.size()])); ou getMap(locations.toArray(new WorldLocation[0])); ou getMap(new WorldLocation[locations.size()]);

@SuppressWarnings ("décoché") est nécessaire pour supprimer l'avertissement ide.

0
Imar