[JAVA] Stream: groupingBy() 함수

2023. 10. 19. 21:26·JAVA/Stream

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/

반응형
저작자표시 비영리 변경금지 (새창열림)
'JAVA/Stream' 카테고리의 다른 글
  • [JAVA] Stream: boxed() 함수 (feat. 형 변환)
Dreaming-J
Dreaming-J
개발자로 성장해가는 과정을 기록하기 위한 공간
    반응형
  • Dreaming-J
    꿈꾸는 개발 공간
    Dreaming-J
  • 전체
    오늘
    어제
    • 카테고리 (46)
      • Infra (2)
      • CS (25)
        • 네트워크 (3)
        • 운영체제 (3)
        • 자료구조 (4)
        • 알고리즘 (15)
      • JAVA (10)
        • IntelliJ (1)
        • Stream (2)
        • String (4)
        • Map (1)
        • 기타 (1)
      • Git·Github (7)
      • 독서 (2)
        • 객체지향 설계 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    조합
    java
    disjoint
    동적 계획법
    string
    그래프
    워샬
    Binary search
    stream
    Dijkstra
    Prim
    순열
    탐색
    자료구조
    Git
    0/1 knapsack
    sort
    Kruskal
    워셜
    집합
    정렬
    독서
    dp
    0/1
    코딩테스트
    다익스트라
    GitLab
    알고리즘
    github
    플로이드-워샬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Dreaming-J
[JAVA] Stream: groupingBy() 함수
상단으로

티스토리툴바