Pull to refresh

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

Reading time2 min
Views127K

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

Tags:
Hubs:
+25
Comments7

Articles