Java > Java 8 Features > Streams API > Collectors
Grouping Employees by Department using Collectors.groupingBy
This snippet demonstrates how to use the Collectors.groupingBy()
method to group a list of Employee
objects by their department. This is a common task in data processing and reporting.
Code Snippet
This code first defines an Employee
class with fields for name, department, and salary. A list of Employee
objects is created. Then, the employees.stream()
method creates a stream of Employee
objects. The collect(Collectors.groupingBy(Employee::getDepartment))
method groups the employees by their department using the groupingBy
collector. The Employee::getDepartment
is a method reference that provides the grouping key (the department). The result is a Map
where the keys are the department names and the values are lists of Employee
objects belonging to that department. Finally, the code iterates through the map and prints the employees grouped by department.
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Employee {
private String name;
private String department;
private int salary;
public Employee(String name, String department, int salary) {
this.name = name;
this.department = department;
this.salary = salary;
}
public String getName() {
return name;
}
public String getDepartment() {
return department;
}
public int getSalary() {
return salary;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", department='" + department + '\'' +
", salary=" + salary +
'}';
}
}
public class GroupingByExample {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", "Sales", 50000),
new Employee("Bob", "Sales", 60000),
new Employee("Charlie", "Engineering", 80000),
new Employee("David", "Engineering", 90000),
new Employee("Eve", "Marketing", 70000)
);
// Group employees by department
Map<String, List<Employee>> employeesByDepartment = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
// Print the result
employeesByDepartment.forEach((department, employeeList) -> {
System.out.println("Department: " + department);
employeeList.forEach(System.out::println);
System.out.println();
});
}
}
Concepts Behind the Snippet
The Collectors.groupingBy()
method is a powerful tool for grouping elements of a stream based on a classifier function. The classifier function extracts a key from each element, and the groupingBy
collector accumulates elements with the same key into a list. This is a fundamental operation in data analysis and manipulation.
Real-Life Use Case Section
Consider an e-commerce platform. You might use Collectors.groupingBy()
to group orders by customer, products by category, or sales by region. This allows you to easily analyze and report on your data.
Best Practices
Employee::getDepartment
) is efficient and doesn't perform expensive computations.
Interview Tip
Be prepared to explain how Collectors.groupingBy()
works, including the role of the classifier function and the resulting data structure (a Map
). Also, be ready to discuss alternative ways to achieve the same result, such as using a traditional loop and a Map
.
When to Use Them
Use Collectors.groupingBy()
when you need to categorize a collection of objects based on a specific attribute and create separate lists for each category. It's most effective when the number of categories is relatively small and manageable.
Memory Footprint
The memory footprint of Collectors.groupingBy()
depends on the number of distinct keys (categories) and the size of the lists associated with each key. If you have a large number of distinct keys or large lists, the memory consumption can be significant.
Alternatives
An alternative to Collectors.groupingBy()
is to use a traditional loop and manually populate a Map
. However, groupingBy()
is often more concise and expressive, especially when combined with other stream operations.
Pros
Map
.
Cons
FAQ
-
What happens if the classifier function returns null?
If the classifier function returnsnull
, the element will be grouped under thenull
key in the resultingMap
. You should handlenull
values appropriately in your classifier function to avoid unexpected behavior. -
Can I group by multiple criteria?
Yes, you can achieve grouping by multiple criteria by creating a composite key. For example, you could create a class that encapsulates both department and role, and then use an instance of that class as the grouping key.