Привет, друзья! Сегодня разберем мощную возможность Stream API – группировка данных с помощью
Collectors.groupingBy(). Это отличный инструмент, когда нужно собирать элементы в группы по какому-то признаку.📌 Как это работает?
Метод
groupingBy используется в Collectors и позволяет группировать элементы по ключу, который мы указываем. Давайте рассмотрим на примере:
import java.util.*;
import java.util.stream.Collectors;
class Person {
String name;
String city;
Person(String name, String city) {
this.name = name;
this.city = city;
}
@Override
public String toString() {
return name;
}
}
public class GroupingExample {
public static void main(String[] args) {
List<Person> people = List.of(
new Person("Иван", "Москва"),
new Person("Анна", "Санкт-Петербург"),
new Person("Сергей", "Москва"),
new Person("Мария", "Казань"),
new Person("Алексей", "Санкт-Петербург")
);
Map<String, List<Person>> groupedByCity = people.stream()
.collect(Collectors.groupingBy(person -> person.city));
groupedByCity.forEach((city, residents) ->
System.out.println(city + ": " + residents)
);
}
}
📌 Разбор кода:
1. У нас есть список
people с объектами Person, у которых есть name и city. 2. Мы применяем
groupingBy, передавая person -> person.city в качестве критерия группировки. 3. Результат –
Map<String, List<Person>>, где ключ – город, а значение – список людей из этого города. 4. Выводим результат, используя
forEach.📌 Выходные данные:
Москва: [Иван, Сергей]
Санкт-Петербург: [Анна, Алексей]
Казань: [Мария]
👉 Теперь представьте, что у вас есть заказы в интернет-магазине, и вам нужно сгруппировать их по статусу. Или у вас есть список сотрудников, и вы хотите разбить их по департаментам.
groupingBy() – это универсальный инструмент, который решает такие задачи.📌 Дополнительные фишки:
1. Подсчет количества элементов в группах:
Map<String, Long> countByCity = people.stream()
.collect(Collectors.groupingBy(p -> p.city, Collectors.counting()));
2. Группировка + редукция: (например, получение списка имен)
Map<String, Set<String>> namesByCity = people.stream()
.collect(Collectors.groupingBy(p -> p.city,
Collectors.mapping(p -> p.name, Collectors.toSet())));
👉@BookJava