Java Stream API groupingBy examples

For inexperienced developer usually it is hard to imagine the real benefit of using Java Stream API instead of regular for/foreach cycles. Today I’ll show several examples that will help you significantly shorten your Java code.

This is our Employee class:

public class Employee {
    private String name;
    private int age;
    private int salary;
    private String position;

    public Employee(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;
    }
}

 

Grouping the list of employees according to their positions (division into lists)

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

 

Grouping the list of employees according to their positions (division into sets)

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

 

Counting the number of employees in a particular position

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

 

Grouping the list of employees according to their positions, while we are only interested in names

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

 

Calculation of the average salary for this position

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

 

Grouping the list of employees by their position, employees are represented only by names in a single line

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

 

Grouping the list of employees by their positions and by age

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

 
If you know more interesting examples of using groupingBy please write them in the comments bellow.

1 COMMENT

LEAVE A REPLY

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.