Collectors.flatMapping()
Разворачивает каждый элемент в поток и собирает все значения другим коллектором. Рядом — filtering().
Доступно с: Java 9
Синтаксис
static <T, U, A, R> Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper, Collector<? super U, A, R> downstream)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| mapper | Function<? super T, ? extends Stream<? extends U>> | Функция, которая возвращает поток значений для элемента. |
| downstream | Collector<? super U, A, R> | Коллектор для всех полученных значений. |
Возвращаемое значение
Collector<T, ?, R>Коллектор для использования внутри groupingBy и подобных.
Примеры
Все теги каждого автора без повторов:
record Post(String author, List<String> tags) {}
void main() {
List<Post> posts = List.of(
new Post("Anna", List.of("java", "streams")),
new Post("Oleg", List.of("sql")),
new Post("Anna", List.of("java", "records")));
var tagsByAuthor = posts.stream()
.collect(Collectors.groupingBy(Post::author, TreeMap::new,
Collectors.flatMapping(p -> p.tags().stream(),
Collectors.toCollection(TreeSet::new))));
IO.println(tagsByAuthor);
}Результат:
{Anna=[java, records, streams], Oleg=[sql]}filtering() отбирает элементы внутри группы. В отличие от filter() перед группировкой, пустые группы остаются:
record Person(String name, String city, int age) {}
void main() {
List<Person> people = List.of(
new Person("Anna", "Paris", 30),
new Person("Oleg", "Berlin", 17),
new Person("Mia", "Paris", 15));
Map<String, Long> adults = people.stream()
.collect(Collectors.groupingBy(Person::city, TreeMap::new,
Collectors.filtering(p -> p.age() >= 18, Collectors.counting())));
IO.println(adults);
}Результат:
{Berlin=0, Paris=1}Примечания
flatMapping() делает внутри группы то же, что flatMap() делает с целым потоком. Оба коллектора появились в Java 9 и обычно стоят вторым аргументом groupingBy() или partitioningBy().
См. также
- Collectors.mapping() — Преобразует элементы перед тем, как передать их другому коллектору. Чаще всего — внутри groupingBy.
- Collectors.groupingBy() — Сборщик, который раскладывает элементы по группам с общим ключом.
- Stream.flatMap() — Превращает каждый элемент в поток и склеивает все потоки в один.
- Collectors.counting() — Сборщик-счётчик; обычно используется внутри `groupingBy()`.
В учебнике
- Группировка — Группировка элементов потока в Java — Collectors.groupingBy, подсчёт и суммы по группам, mapping, TreeMap и partitioningBy.