Supposons que nous ayons un Collection<Foo>
. Quelle est la meilleure façon (la plus courte en LoC dans le contexte actuel) de la transformer Foo[]
? Toutes les bibliothèques connues sont autorisées.
UPD: (un cas de plus dans cette section; laissez des commentaires si vous pensez que cela vaut la peine de créer un autre thread pour cela): Qu'en est-il de la transformation Collection<Foo>
en Bar[]
where Bar
has constructeur avec 1 paramètre de type Foo
ie public Bar(Foo foo){ ... }
?
java
arrays
collections
transformation
romain
la source
la source
Stream.toArray
API existante du JDK.Réponses:
Où
x
est la collection:la source
x.toArray(new Foo[0])
--- documentation : pas le temps de lire ...(new Foo[0])
. Selon la documentation Collection.toArray, `@param est le tableau dans lequel les éléments de cette collection doivent être stockés, s'il est suffisamment grand`, ce qui signifie qu'il les stockera directement dans ce nouveau tableau. Si vous lui donnez un tableau de taille 0, il créera un nouveau tableau, ce qui signifie que vous avez un petit tableau et un grand tableau en cours de création lorsque cela n'est pas nécessaire.toArray
créer un tableau cible du type correct. Et dans ce cas, honnêtement, je ne me soucierais pas d'un seul tableau vide supplémentaire dans mon application. C'est bien en dessous du niveau de bruit.new Foo[0]
est plus simple "mais pas la meilleure (mémoire)" ... c'est-à-dire que ma solution est plus simple mais pas la meilleure (c'est la raison pour laquelle j'ai utilisé:
).new Foo[0]
variante proposée par Carlos ne souffre pas de ce problème.Solution alternative à la question mise à jour en utilisant Java 8:
la source
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);
Si vous l'utilisez plus d'une fois ou en boucle, vous pouvez définir une constante
et faire la conversion comme
La
toArray
méthode utilise le tableau vide pour déterminer le type correct du tableau cible et crée un nouveau tableau pour vous.Voici ma proposition de mise à jour:
la source
const
n'est pas Java!public static final Foo[] FOO = {}
import static
pour les atteindre.Avec JDK / 11, une autre façon de convertir un
Collection<Foo>
en unFoo[]
pourrait être d'utiliserCollection.toArray(IntFunction<T[]> generator)
comme:Comme expliqué par @Stuart sur la liste de diffusion (c'est moi qui souligne), les performances de celui-ci devraient essentiellement être les mêmes que celles de l'existant
Collection.toArray(new T[0])
-La mise en œuvre de l'API dans le JDK se lit comme suit:
Remarque : - Simplement que l'utilisation de l'API doit être guidée avec une incompatibilité descendante lorsqu'elle est utilisée pour du code avec des
null
valeurs, par exempletoArray(null)
puisque ces appels seraient maintenant ambigus en raison de l'existanttoArray(T[] a)
et échoueraient à se compiler.la source
Si vous utilisez Guava dans votre projet, vous pouvez utiliser
Iterables::toArray
.la source
Pour l'original, voir la réponse doublep :
Quant à la mise à jour:
la source
Voici la solution finale pour le cas dans la section mise à jour (avec l'aide de Google Collections):
Mais, l'approche clé ici a été mentionnée dans la réponse du doublep (j'ai oublié la
toArray
méthode).la source
new Bar[0]
évite le problème.Par exemple, vous avez la collection ArrayList avec des éléments Student class:
la source