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

  • Tutorial

Новичкам зачастую трудно представить выгоду от использования 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
  • 27,5k
  • 7
Поддержать автора
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 7

    0
    У пунктов 1 и 2 одинаковые названия (Группировка списка рабочих по их должности), а код разный(
      0
      Принял во внимание)
      0
      Еще неплохо бы группировку по нескольким полям добавить с вложенным groupingBy(). Недавно как раз была задача на эту тему.
        0
        Ссылку можно?
          0
          Уже все нашлось как я вижу :)
        0
        Не могу понять в чём разница между 1 и 2.
          0
          Отличаются результаты
          1 Map<String, List>
          2 Map<String, Set>

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое