Новичкам зачастую трудно представить выгоду от использования 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? Пишите их в комментарии.

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


  1. EreminD
    07.02.2018 17:18

    У пунктов 1 и 2 одинаковые названия (Группировка списка рабочих по их должности), а код разный(


    1. PqDn Автор
      07.02.2018 17:32

      Принял во внимание)


  1. j2ck
    07.02.2018 18:41

    Еще неплохо бы группировку по нескольким полям добавить с вложенным groupingBy(). Недавно как раз была задача на эту тему.


    1. PqDn Автор
      07.02.2018 18:42

      Ссылку можно?


      1. j2ck
        08.02.2018 10:35

        Уже все нашлось как я вижу :)


  1. MrUstik
    08.02.2018 11:53

    Не могу понять в чём разница между 1 и 2.


    1. PqDn Автор
      08.02.2018 12:10

      Отличаются результаты
      1 Map<String, List>
      2 Map<String, Set>