Вы можете обработать поток во внутренних списках, а затем отфильтровать элементы A
на основе данных в их полях b
:
List<List<A>> selected =
listA.parallelStream()
.map(aList -> aList.stream()
.filter(a -> a.getB()
.stream()
.anyMatch(b -> !b.getC().isEmpty()))
.collect(Collectors.toList()))
.collect(Collectors.toList());
Чтобы удалить из одного экземпляра списка, вы можете просто запуститьоснованная на индексе итерация по основному списку, а затем явное удаление из внутренних списков элементов, соответствующих критериям:
IntStream.range(0, listA.size())
.forEach(
i -> listA.get(i)
.removeAll(
listA.get(i)
.stream()
.filter(a -> a.getB().stream().allMatch(b -> b.getC().size() == 0))
.collect(Collectors.toList())) );
Этот последний фрагмент просто компилирует List<A>
(который каким-то образом содержит пустой List<C>
в дереве) удаляется из соответствующих записей в основном списке.