Collectors.mapping()
Преобразует элементы перед тем, как передать их другому коллектору. Чаще всего — внутри groupingBy.
Доступно с: Java 8
Синтаксис
static <T, U, A, R> Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper, Collector<? super U, A, R> downstream)Параметры
| Параметр | Тип | Описание |
|---|---|---|
| mapper | Function<? super T, ? extends U> | Функция преобразования элемента. |
| downstream | Collector<? super U, A, R> | Коллектор, который соберёт преобразованные значения. |
Возвращаемое значение
Collector<T, ?, R>Коллектор, который сначала применяет mapper, затем downstream.
Примеры
Имена людей по городам — в группе хранятся не объекты, а только имена:
record Person(String name, String city) {}
void main() {
List<Person> people = List.of(
new Person("Anna", "Paris"),
new Person("Oleg", "Berlin"),
new Person("Mia", "Paris"));
Map<String, List<String>> names = people.stream()
.collect(Collectors.groupingBy(Person::city, TreeMap::new,
Collectors.mapping(Person::name, Collectors.toList())));
IO.println(names);
}Результат:
{Berlin=[Oleg], Paris=[Anna, Mia]}Вместе с joining() — сразу строка в каждой группе:
record Person(String name, String city) {}
void main() {
List<Person> people = List.of(
new Person("Anna", "Paris"),
new Person("Oleg", "Berlin"),
new Person("Mia", "Paris"));
Map<String, String> names = people.stream()
.collect(Collectors.groupingBy(Person::city, TreeMap::new,
Collectors.mapping(Person::name, Collectors.joining(", "))));
IO.println(names);
}Результат:
{Berlin=Oleg, Paris=Anna, Mia}Примечания
На верхнем уровне mapping() не нужен — там проще написать stream.map(...).collect(...). Его смысл в том, чтобы преобразовать элементы внутри группы, когда map() уже не применить. Родственные коллекторы: filtering() и flatMapping() (Java 9).
См. также
- Collectors.groupingBy() — Сборщик, который раскладывает элементы по группам с общим ключом.
- Collectors.flatMapping() — Разворачивает каждый элемент в поток и собирает все значения другим коллектором. Рядом — filtering().
- Collectors.joining() — Сборщик, который склеивает строки потока в одну.
- Stream.map() — Преобразует каждый элемент потока.
В учебнике
- Группировка — Группировка элементов потока в Java — Collectors.groupingBy, подсчёт и суммы по группам, mapping, TreeMap и partitioningBy.