web-dev-qa-db-fra.com

Comment créer une liste avec N objets?

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

}
13
Marci-man

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)
20
Eugene

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)));
23
errantlinguist

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.

2
Nico

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.

2
Donald Raab

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