[java] 스트림 API를 이용한 데이터 그루핑 방법

스트림 API는 자바 8 이후부터 제공되는 강력한 기능으로, 데이터 컬렉션을 처리하는 데에 매우 유용합니다. 그 중에서도 데이터를 그룹화하는 작업은 자주 필요한 작업 중 하나입니다. 이번 블로그에서는 스트림 API를 이용하여 데이터를 그룹화하는 방법에 대해 알아보겠습니다.

1. 단일 그룹화

가장 간단한 형태의 그룹화는 한 가지 기준에 따라 데이터를 그룹화하는 것입니다. 이를 위해서는 Collectors.groupingBy 메서드를 사용합니다. 예를 들어, 다음과 같은 리스트가 있다고 가정해봅시다.

List<String> fruits = Arrays.asList("apple", "banana", "orange", "apple", "banana");

이 리스트를 과일의 종류에 따라 그룹화하고 싶다면 다음과 같이 코드를 작성할 수 있습니다.

Map<String, List<String>> groupedFruits = fruits.stream()
                                                .collect(Collectors.groupingBy(fruit -> fruit));

위 코드에서 groupingBy 메서드의 인자로는 그룹화할 기준이 되는 람다 표현식을 넘겨줍니다. 이를 통해 과일의 종류로 그룹화된 맵을 얻을 수 있습니다.

2. 다중 그룹화

때로는 여러 가지 기준에 따라 데이터를 그룹화해야 할 때도 있습니다. 이를 위해서는 Collectors.groupingBy를 중첩하여 사용할 수 있습니다. 예를 들어, 다음과 같은 학생 리스트가 있다고 가정해봅시다.

List<Student> students = Arrays.asList(
    new Student("John", "Math", 85),
    new Student("John", "English", 90),
    new Student("Alice", "Math", 95),
    new Student("Alice", "English", 92)
);

이제 학생을 이름과 과목으로 그룹화하고 싶다면 다음과 같이 코드를 작성할 수 있습니다.

Map<String, Map<String, List<Student>>> groupedStudents = students.stream()
    .collect(Collectors.groupingBy(Student::getName,
             Collectors.groupingBy(Student::getSubject)));

위 코드에서는 groupingBy 메서드를 중첩하여 두 번째 그룹화 기준으로 과목을 사용했습니다. 따라서 이름으로 먼저 그룹화한 뒤에 과목으로 다시 그룹화한 맵을 얻을 수 있습니다.

결론

스트림 API를 사용하면 데이터 그루핑 작업을 간단하게 수행할 수 있습니다. 단일 그룹화와 다중 그룹화를 통해 데이터를 원하는 기준에 따라 그룹화할 수 있습니다. 스트림 API의 다양한 기능을 이용하면 데이터 처리 작업을 더욱 효율적으로 수행할 수 있습니다.

참고 자료