web-dev-qa-db-fra.com

Comment faire une nouvelle liste avec une propriété d'un objet qui est dans une autre liste

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?

71
Javatar

Java 8 façon de le faire: -

List<Integer> idList = students.stream().map(Student::getId).collect(Collectors.toList());
150
Kaushik

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));
39
Premraj

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.

22
Javatar

Solution d'expression Java 8 lambda:

List<Integer> iDList = students.stream().map((student) -> student.getId()).collect(Collectors.toList());
6
Vijay Gupta

Si quelqu'un arrive après quelques années:

List<String> stringProperty = (List<String>) CollectionUtils.collect(listOfBeans, TransformerUtils.invokerTransformer("getProperty"));
5
Jonathan Perrotta