A downstream mapping collector transforms each group's elements before they are gathered - here into a de-duplicated, sorted set of names per department.
record Employee(String dept, String name) {}
var staff = List.of(new Employee("eng", "Ava"), new Employee("eng", "Ben"),
new Employee("eng", "Ava"), new Employee("ops", "Cara"));
Map<String, Set<String>> namesByDept = staff.stream().collect(
Collectors.groupingBy(Employee::dept, TreeMap::new,
Collectors.mapping(Employee::name, Collectors.toCollection(TreeSet::new))));
System.out.println(namesByDept);
{eng=[Ava, Ben], ops=[Cara]}
Run this yourself in the Online Java Compiler, spin up a live REST API in the API Sandbox, or practise with Java interview questions.
Published 2026-07-30