Метод groupingBy
Метод groupingBy класса Collectors выполняет
группировку элементов потока. В первом параметре мы передаем
функцию-классификатор, которая определяет, по какому признаку
группировать элементы. Вторым (необязательным) параметром
можно передать нижестоящий коллектор, который определяет,
что делать с элементами каждой группы. Третьим (необязательным)
параметром можно передать фабрику для создания Map.
Метод возвращает объект типа Map, где ключ - это
результат классификатора, а значение - результат работы
нижестоящего коллектора.
Синтаксис
Collectors.groupingBy(classifier)
Collectors.groupingBy(classifier, downstream)
Collectors.groupingBy(classifier, mapFactory, downstream)
Пример
Давайте сгруппируем строки по их длине:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("a", "bb", "cc", "ddd", "ee");
Map<Integer, List<String>> res = list.stream()
.collect(Collectors.groupingBy(s -> s.length()));
System.out.println(res);
}
}
Результат выполнения кода:
{1=[a], 2=[bb, cc, ee], 3=[ddd]}
Пример
Давайте сгруппируем числа по остатку от деления на 2
и посчитаем количество элементов в каждой группе:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> list = List.of(1, 2, 3, 4, 5);
Map<Integer, Long> res = list.stream()
.collect(Collectors.groupingBy(
n -> n % 2,
Collectors.counting()
));
System.out.println(res);
}
}
Результат выполнения кода:
{0=2, 1=3}
Пример
Давайте сгруппируем строки по длине и преобразуем элементы каждой группы в верхний регистр:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> list = List.of("a", "bb", "cc", "ddd");
Map<Integer, List<String>> res = list.stream()
.collect(Collectors.groupingBy(
s -> s.length(),
Collectors.mapping(
s -> s.toUpperCase(),
Collectors.toList()
)
));
System.out.println(res);
}
}
Результат выполнения кода:
{1=[A], 2=[BB, CC], 3=[DDD]}
Смотрите также
-
класс
Collectors,
который содержит методы для коллекционирования -
метод
partitioningBy,
который делит элементы на две группы -
метод
toMap,
который собирает элементы в Map -
метод
mapping,
который преобразует элементы перед сбором