I tener una colección de Parent
objetos y cada uno tiene una colección de Child
elementos, por ejemplo:
public class Parent {
private Collection<Child> children;
}
public class Child {
private String type;
}
¿Cómo iba a utilizar Java 8 de programación funcional para filtrar y recoger una colección de Child
la que el tipo es igual a 'A'?
He intentado esto con la siguiente:
Collection<Child> filteredChildren = parents.stream()
.forEach(p ->
filteredChildren.addAll(p.getChildren().stream()
.filter(c -> c.getType().equals("A"))
.collect(Collectors.toList()))
);
Pero me sale el siguiente error:
Variable 'filteredChildren' inicializador 'parents.stream () .forEach (p -> ...' es redundante menos ... (⌘F1) Este puntos de inspección fuera de los casos en que un valor de la variable no se usa nunca después de su asignación, es decir: - la variable nunca se leyó después de la asignación OR - el valor siempre se sobrescribe con otra asignación antes de la siguiente variable de lectura o - la variable inicializador es redundante (para una de las anteriores dos razones)
¿Cómo se filtran las colecciones anidadas por tipo y los recojo?
Es incorrecto utilizar forEach
en su código para el terminal de Stream
operación, ya que no produce ninguna salida, por lo que no se puede asignar a la filteredChildren
variable.
Utilice flatMap
el fin de obtener un piso Stream
de todos los Child
casos (filtrada por tipo) de todos los Parent
casos y, a continuación, a cobro revertido a un List
:
Collection<Child> filteredChildren =
parents.stream()
.flatMap(p -> p.getChildren()
.stream()
.filter(c -> c.getType().equals("A")))
.collect(Collectors.toList());