Как стать автором
Обновить

7 способов использовать groupingBy в Stream API

Время на прочтение2 мин
Количество просмотров127K

Новичкам зачастую трудно представить выгоду от использования Stream API заместо обычных циклов,
под катом несколько примеров, которые помогут вам существенно сжать ваш раздутый код



Класс рабочего, над которым будем ставить эксперименты
public class Worker{
    private String name;
    private int age;
    private int salary;
    private String position;

    public Worker(String name, int age, int salary, String position) {
        this.name = name;
        this.age = age;
        this.salary = salary;
        this.position = position;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public int getSalary() {
        return salary;
    }

    public String getPosition() {
        return position;
    }
}

1. Группировка списка рабочих по их должности (деление на списки)


 Map<String, List<Worker>> map1 = workers.stream()
       .collect(Collectors.groupingBy(Worker::getPosition));

2. Группировка списка рабочих по их должности (деление на множества)


Map<String, Set<Worker>> map2 = workers.stream()
       .collect(Collectors.groupingBy(Worker::getPosition, Collectors.toSet()));

3. Подсчет количества рабочих, занимаемых конкретную должность


Map<String, Long> map3 = workers.stream()
       .collect(Collectors.groupingBy(Worker::getPosition, Collectors.counting()));

4. Группировка списка рабочих по их должности, при этом нас интересуют только имена


Map<String, Set<String>> map4 = workers.stream()
       .collect(Collectors.groupingBy(Worker::getPosition, 
              Collectors.mapping(Worker::getName, Collectors.toSet())));

5. Расчет средней зарплаты для данной должности


Map<String, Double> map5 = workers.stream()
       .collect(Collectors.groupingBy(Worker::getPosition,
              Collectors.averagingInt(Worker::getSalary)));

6. Группировка списка рабочих по их должности, рабочие представлены только именами единой строкой


Map<String, String> map6 = workers.stream()
       .collect(Collectors.groupingBy(Worker::getPosition,
              Collectors.mapping(Worker::getName, 
                     Collectors.joining(", ", "{","}")))
       );

7. Группировка списка рабочих по их должности и по возрасту.


Подсказал пользователь j2ck


Map<String, Map<Integer, List<Worker>>> collect = workers.stream()
       .collect(Collectors.groupingBy(Worker::getPosition, 
              Collectors.groupingBy(Worker::getAge)));

Есть еще оригинальные идеи использования groupingBy? Пишите их в комментарии.

Теги:
Хабы:
+25
Комментарии7

Публикации

Истории

Работа

Java разработчик
358 вакансий

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн