Я не был уверен, что такое Post, поэтому я использовал вместо него String и отфильтровал его по длине String 2. Вы должны иметь возможность адаптировать его для использования любого класса с соответствующим фильтром.
Вот то, что я придумал. Вы сказали, что хотите вернуть список, поэтому я сделал это вместо набора. Обратите внимание, что вам не нужно делать второе преобразование, поэтому collectingAndThen
не требуется.
List<Category> categoryRepository = new ArrayList<>();
categoryRepository.add(
new Category(Set.of("A", "B", "C", "DE", "FG", "ABC")));
categoryRepository.add(new Category(
Set.of("AAAA", "BBBB", "CC", "DDDE", "FFFG", "ABC", "12")));
categoryRepository.add(
new Category(Set.of("ARS", "AB", "CCC", "RE", "GG", "ABC")));
List<String> list = categoryRepository.stream().flatMap(
a -> a.getPosts().stream()).filter(a -> a.length() == 2).collect(
Collectors.toList());
System.out.println(list);
}
}
class Category {
private Set<String> posts;
public Category(Set<String> posts) {
this.posts = posts;
}
public Set<String> getPosts() {
return posts;
}
}
- Список преобразуется в поток () категории
- Затем каждая категория извлекает Set с помощью getPosts () и направляется в общий поток строк (это будут для вас сообщения).
- Затем каждая строка (сообщение) фильтруется и помещается в список или набор
Ваш выбор и вернулся.