0. 서론
Collectors.groupingBy() 함수는 SQL에서의 'GROUP BY' 절과 유사한 함수이다.
groupingBy(classifier)
groupingBy(classifier, collector)
groupingBy(classifier, supplier, collector)
groupingBy() 함수는 collector에 조건으로 "GROUP BY" 작업을 진행한 후 결과를 Map으로 반환한다.
classifier: 반환된 Map의 key
collector: 반환된 Map의 value이며, 기본값은 Collectors.toList()
supplier: 생성되는 Map의 형태를 결정하며, TreeMap, LinkedHashMap or ConcurrentMap과 같은 다른 맵으로 설정이 가능하다.
1. 사용법
아래 코드는 공통 코드이다.
record Person(int id, String name, String job, int age){ }
List<Person> persons = List.of(
new Person(1, "Alex", "student", 15),
new Person(1, "Brian", "salesman", 25),
new Person(2, "Caitlyn", "salesman", 30),
new Person(2, "David", "salesman", 40),
new Person(2, "Edward", "student", 20));
1-1. 기본 사용법
Map<Integer, List<Person>> map = persons.stream()
.collect(groupingBy(Person::id));
System.out.println(map);
결과
{ 1 = [Person[id=1, name=Alex, job=student, age=15],
Person[id=1, name=Brian, job=salesman, age=25]],
2 = [Person[id=2, name=Caitlyn, job=salesman, age=30],
Person[id=2, name=David, job=salesman, age=40],
Person[id=2, name=Edward, job=student, age=20]]}
1-2. mapping() 활용
Map<Integer, List<String>> map = persons.stream()
.collect(groupingBy(Person::id, mapping(Person::job, toList())));
System.out.println(map);
결과
{1 = [student, salesman],
2 = [salesman, student, salesman]}
1-3. counting() 활용
counting() 결과 Long 타입이 반환된다.
Map<Integer, Long> map = persons.stream()
.collect(groupingBy(Person::id, counting()));
System.out.println(map);
결과
{1 = 2,
2 = 3}
1-4. averaging() 활용
averagingDouble()
averagingInt()
averagingLong()
averaging() 결과 Double 타입이 반환된다.
Map<Integer, Double> map = persons.stream()
.collect(groupingBy(Person::id, averageInt(Person::age)));
System.out.println(map);
결과
{1 = 20.0,
2 = 30.0}
1-5. maxBy(), minBy() 활용
Map<Integer, Optional<Person>> map = persons.stream()
.collect(groupingBy(Person::id, maxBy(Comparator.comparing(Person::age))));
System.out.println(map);
결과
{ 1 = Optional[Person[id=1, name=Brian, job=salesman, age=25]],
2 = Optional[Person[id=2, name=David, job=salesman, age=40]]}
2. 참고
https://howtodoinjava.com/java/stream/collectors-groupingby/
반응형