Если предположить, что три уровня в вашей структуре данных являются коллекциями, решение может быть следующим:
- сплющить структуру до уровня потока листьев
- фильтр по требуемым заголовкам
final List<ThirdClassList> results = firstClassList
.stream()
.flatMap(FirstClassList::getSecondClassList)
.flatMap(FirstClassList::getThirdClassList)
.filter(third -> !titles.contains(third))
.collect(toList());
Это даст вам объекты уровня листьев, которые нужно удалить, хотя это, конечно, только половина решения, вы все равно хотите удалить их.
Если вы являетесь автором классов списков, то, возможно, у вас может быть ссылка с каждого третьего уровня на его «родительский» второй уровень, поэтому удаление - это относительно простой второй шаг:
results.forEach(third -> third.parent().remove(this));
где third.parent()
возвращает объект второго уровня.