91 votes

Comment créer une nouvelle liste avec une propriété d'un objet qui se trouve dans une autre liste ?

Imaginons que je dispose d'une liste de certains objets :

List<Student>

Et je dois générer une autre liste incluant les ids de Students dans la liste ci-dessus :

List<Integer>

En évitant d'utiliser une boucle, est-il possible d'y parvenir en utilisant collections apache o goyave ?

Quelles méthodes devraient être utiles dans mon cas ?

195voto

Kaushik Points 2991

La façon de faire de Java 8 :-

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

42voto

Premraj Points 2931

Avec Guava, vous pouvez utiliser des fonctions 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);

Il est certain qu'il tournera en boucle afin d'extraire tous les identifiants, mais n'oubliez pas que les méthodes guava renvoient la vue et la fonction ne seront appliquées que lorsque vous tenterez d'itérer sur le fichier List<Integer>
Si vous ne faites pas d'itération, la boucle ne sera jamais appliquée.

Remarque : N'oubliez pas qu'il s'agit d'une vue et que si vous souhaitez itérer plusieurs fois, il est préférable de copier le contenu dans un autre fichier. List<Integer> comme

ImmutableList.copyOf(Iterables.transform(students, StudentToId.INSTANCE));

22voto

Javatar Points 962

Merci à Premraj pour l'option alternative cool, upvoted.

J'ai utilisé les CollectionUtils et BeanUtils d'Apache. En conséquence, je suis satisfait des performances du code suivant :

List<Long> idList = (List<Long>) CollectionUtils.collect(objectList, 
                                    new BeanToPropertyValueTransformer("id"));

Il convient de mentionner que je vais comparer les performances de la goyave ( Premraj fournis) et collectionUtils que j'ai utilisés ci-dessus, et décidez de la plus rapide.

9voto

Vijay Gupta Points 1669

Solution pour les expressions lambda de Java 8 :

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

6voto

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X