J'ai une collection d' Parent
objets et chacun a une collection d' Child
éléments, par exemple:
public class Parent {
private Collection<Child> children;
}
public class Child {
private String type;
}
Comment puis-je utiliser Java 8 programmation fonctionnelle pour filtrer et rassembler une collection d' Child
où le type est égal à « A »?
J'ai essayé ce qui suit:
Collection<Child> filteredChildren = parents.stream()
.forEach(p ->
filteredChildren.addAll(p.getChildren().stream()
.filter(c -> c.getType().equals("A"))
.collect(Collectors.toList()))
);
Mais je reçois l'erreur suivante:
Variable 'filteredChildren' initialiseur 'parents.stream () .foreach (p -> ...' est redondant moins ... (⌘F1) Ce Les points d'inspection les cas dans lesquels une valeur variable est jamais utilisé après sa mission, à savoir: - la variable n'est lu après cession ou - la valeur est toujours remplacée par une autre affectation avant la prochaine variable de lecture ou - la variable initialiseur est redondante (pour l'une des deux raisons ci-dessus)
Comment puis-je filtrer les collections imbriquées par type et collectionne?
Il est faux d'utiliser forEach
dans votre code pour le terminal Stream
opération, car elle ne produit pas de sortie, de sorte que vous ne pouvez pas l' attribuer à la filteredChildren
variable.
Utilisez flatMap
pour obtenir un plat Stream
de tous les Child
cas (filtrés par type) de toutes les Parent
instances, puis Collect à List
:
Collection<Child> filteredChildren =
parents.stream()
.flatMap(p -> p.getChildren()
.stream()
.filter(c -> c.getType().equals("A")))
.collect(Collectors.toList());