2 votes

Comment filtrer des boucles imbriquées en utilisant les flux et les filtres de Java 8 ?

J'ai deux POJOs simples :

public class Parent {
    String name;
    List<Child> children = new ArrayList<>();
    void addChild(Integer age) { children.add(new Child(age)); }
}

public class Child {
    Integer age;
}

Puis je génère des données, j'ajoute pour les parents 100 enfants :

List<Parent> parentList = new ArrayList<>();

Parent first = new Parent("first");
for (int i = 0; i < 100; ++i) { first.addChild(i); }
parentList.add(first);

Mon but est de retirer tous les enfants de moins de dix ans :

parentList.stream().forEach(parent -> {
    parent.setChildren(getChildrenOlderThan(parent));
});

List<Child> getChildrenOlderThan10(Parent parent) {
    return parent.getChildren().stream()
        .filter(child -> child.getAge() > 10)
        .collect(Collectors.toList());
}

Enfin, j'ai une liste d'enfants de plus de dix ans. Mais je ne veux pas écrire une méthode séparée getChildrenOlderThan.

Comment obtenir tous les parents avec des enfants de plus de dix ans en utilisant uniquement le flux unique ?

4voto

Andrii Abramov Points 3881

Il y a une bonne méthode Collection.removeIf(Predicate<? super E> filter) método.

Par exemple :

class Example {

    public static void main(String[] args){

        List<Parent> parentList = new ArrayList<>();

        // init parents with children

        parentList.forEach(parent -> 
             parent.getChildren().removeIf(Example::childOlderThan10)
        );

    }

    static boolean childOlderThan10(Child child) {
        return child != null && child.getAge() > 10;
    }
}

Voir plus : Références de la méthode , Collection.stream().forEach() vs Collection.forEach() ?

0voto

Harmlezz Points 3632

Vous pouvez mettre en ligne la méthode getChildreanOlderThan comme ceci :

parentList.stream().forEach(parent -> {
    parent.setChilds(parent.getChildren().stream()
            .filter(child -> child.getAge() > 10)
            .collect(Collectors.toList()));
    });

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