J'essaie de créer une liste d'objets avec n éléments. J'essaie de le faire de la manière la plus Java 8 possible. Quelque chose de similaire à la question posée c # ici: Créer N objets et les ajouter à une liste
Quelque chose comme ça:
List <Objects> getList(int numOfElements)
{
}
Si j'ai bien compris votre question:
List <Object> getList(int numOfElements){
return IntStream.range(0, numOfElements)
.mapToObj(Object::new) // or x -> new Object(x).. or any other constructor
.collect(Collectors.toList());
}
Si vous voulez le même objet n fois:
Collections.nCopies(n, T)
Vous pouvez utiliser Stream.generate(Supplier<T>)
en combinaison avec une référence à un constructeur, puis utiliser Stream.limit(long)
pour spécifier combien vous devez construire:
Stream.generate(Objects::new).limit(numOfElements).collect(Collectors.toList());
Au moins pour moi, cela est plus lisible et illustre l'intention beaucoup plus clairement que l'utilisation d'un IntStream
pour l'itération comme par exemple Alberto Trindade Tavares a suggéré .
Si vous voulez quelque chose qui fonctionne mieux en termes de complexité et d'utilisation de la mémoire, passez la taille du résultat à Stream.collect(Collector<? super T,A,R>)
:
Stream.generate(Objects::new).limit(numOfElements).collect(Collectors.toCollection(() -> new ArrayList<>(numOfElements)));
Pourquoi ne pas rester simple ?? Si vous souhaitez utiliser LINQ ou une Lambda, c'est certainement possible, mais la question est de savoir s'il est plus lisible ou maintenable.
List <Objects> getList(int numOfElements)
{
List<Objects> objectList = new LinkedList<>();
for(int i = 0; i <= numOfElements; i++)
{
objectList.add(new Object());
}
return objectList;
}
Si vous insistez, cela peut être le lambda:
return IntStream.range(0, numOfElements)
.mapToObj(x -> new Objects())
.collect(Collectors.toList());
Crédits à @Alberto Trindade depuis qu'il l'a posté plus vite que moi.
Si cela ne vous dérange pas une dépendance tierce, ce qui suit fonctionnera avec Collections Eclipse :
List<Object> objects = Lists.mutable.withNValues(10, Object::new);
Verify.assertSize(10, objects);
Remarque: je suis un committer pour les collections Eclipse.
Une implémentation équivalente du code C # que vous avez mentionné dans Java 8, avec streams
, est la suivante (EDIT pour utiliser mapToObj, suggéré par @Eugene):
List <Objects> getList(int numOfElements)
{
return IntStream.range(0, numOfElements)
.mapToObj(x -> new Objects())
.collect(Collectors.toList());
}