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

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


829d7e271f643d4722d7d0b32ccbb9ea.png


Класс рабочего, над которым будем ставить эксперименты
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> map1 = workers.stream()
       .collect(Collectors.groupingBy(Worker::getPosition));


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


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


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


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


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


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


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


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


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


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


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


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


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


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

© Habrahabr.ru