Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

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)

Параметры

ПараметрТипОписание
mapperFunction<? super T, ? extends Stream<? extends U>>Функция, которая возвращает поток значений для элемента.
downstreamCollector<? 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.