Imaginez que j'ai une liste de certains objets:
List<Student>
Et je dois générer une autre liste comprenant le ids
de Students
dans la liste ci-dessus:
List<Integer>
En utilisant une boucle, est-il possible d'y parvenir en utilisant collections Apache ou goyave?
Quelles méthodes devraient être utiles dans mon cas?
Java 8 façon de le faire: -
List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
Avec Guava, vous pouvez utiliser une fonction comme -
private enum StudentToId implements Function<Student, Integer> {
INSTANCE;
@Override
public Integer apply(Student input) {
return input.getId();
}
}
et vous pouvez utiliser cette fonction pour convertir la liste des étudiants en identifiants comme -
Lists.transform(studentList, StudentToId.INSTANCE);
Certes, il sera mis en boucle pour extraire tous les identifiants, mais souvenez-vous que les méthodes de goyave renvoient view et Function ne sera appliqué que si vous essayez de parcourir le List<Integer>
Si vous ne parcourez pas, cela n’appliquera jamais la boucle.
Remarque: rappelez-vous qu’il s’agit de la vue. Si vous souhaitez effectuer plusieurs itérations, il est préférable de copier le contenu dans un autre List<Integer>
comme
ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));
Merci à Premraj pour l’option alternative cool, votée.
J'ai utilisé Apache CollectionUtils et BeanUtils. En conséquence, je suis satisfait de l'exécution du code suivant:
List<Long> idList = (List<Long>) CollectionUtils.collect(objectList,
new BeanToPropertyValueTransformer("id"));
Il est à noter que, je vais comparer les performances de goyave (Premraj fournies) et de collectionUtils que j'ai utilisées ci-dessus, et de décider du plus rapide.
Solution d'expression Java 8 lambda:
List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
Si quelqu'un arrive après quelques années:
List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));