Tengo un bucle que hace lo que quiero: agrega objetos de tipo A a la lista de results :
ArrayList<A> results = new ArrayList<>(); for (A a: listOfA) { for (B b : a.getListOfB()) { if ("myString".equals(b.getMyString())) { results.add(a); } } } Ahora me gustaría refactorizar mi código usando secuencias de Java 8 y se me ocurrió esta solución con la que estoy atrapado porque recopila objetos de tipo B en lugar de A - List<A> results = ... es obviamente incorrecto:
List<A> results = listOfA.stream() .flatMap(a -> a.getListOfB().stream()) .filter(b -> "myString".equals(b.getMyString())) .collect(Collectors.toList()); ¿Cómo puedo recopilar una lista de tipo A usando flujos de Java 8?
Encontré muchos resultados aquí en SO buscando secuencias foreach anidadas [java], pero no pude encontrar nada que se adaptara a mis necesidades.
No necesitas flatMap aquí. Simplemente aplique un filter en Stream<A> .
List<A> results = listOfA.stream() .filter(a -> a.getListOfB() .stream() .anyMatch(b -> "myString".equals(b.getMyString()))) .collect(Collectors.toList()); Esto supone que no desea agregar una instancia de A varias veces a la List si tiene varias instancias de B que coinciden con "myString" .