Java - stream - Collectors.groupingBy

1 분 소요

Java - stream - Collectors.groupingBy

  • Collectors.groupingBy(function)은 stream의 각 요소에 function을 적용하고 적용 결과를 key에 원소를 value에 넣어서 Map으로 리턴하는 방법을 말합니다.
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.*;

class Main {
    public static void main(String[] args) throws Exception {
        // Collectors.groupingBy(function)
        // function의 결과를 key에 넣고, 대응되는 원소를 value에 list로 모아서 넣습니다.
        List<Integer> integerLst = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);

        Function<Integer, Integer> moduloByFive = (Integer x) -> x % 3;

        Map<Integer, List<Integer>> remainderToInteger;
        remainderToInteger = integerLst.stream()
                .collect(Collectors.groupingBy(moduloByFive));

        for ( Integer key : remainderToInteger.keySet() ) {
            System.out.printf("== key: %s\n", key);
            System.out.println(remainderToInteger.get(key));
        }
        /*
        == key: 0
        [3, 6, 9]
        == key: 1
        [1, 4, 7]
        == key: 2
        [2, 5, 8]
        */
    }
}
  • 또한 모아진 애들별로 operation을 추가로 적용할 수도 있습니다.
import java.util.*;
import java.util.stream.*;

class Main {
    public static void main(String[] args) throws Exception {
        // Collectors.groupingBy(function)
        // function의 결과를 key에 넣고, 대응되는 원소를 value에 list로 모아서 넣습니다.
        List<Integer> integerLst = List.of(1, 2, 3, 3, 3, 3);

        integerLst.stream()
                .collect(
                        Collectors.groupingBy(
                                // 첫번째 argument에는 key function을 넣고
                                (Integer x) -> x % 3,
                                // 첫번째 argument에는 value accumulator를 넣어줍니다.
                                Collectors.reducing(0, (x, y) -> x + y)
                        )
                ).entrySet().stream()
                .forEach(
                        (Map.Entry e) ->  {
                            System.out.printf("key: %d, value: %d \n", e.getKey(), e.getValue());
                        }
                );
                /*
                key: 0, value: 12
                key: 1, value: 1
                key: 2, value: 2
                * */
        integerLst.stream()
                .collect(
                        Collectors.groupingBy(
                                // 첫번째 argument에는 key function을 넣고
                                (Integer x) -> x % 3,
                                // 첫번째 argument에는 value accumulator를 넣어줍니다.
                                Collectors.counting()
                        )
                ).entrySet().stream()
                .forEach(
                        (Map.Entry e) ->  {
                            System.out.printf("key: %d, value: %d \n", e.getKey(), e.getValue());
                        }
                );
                /*
                key: 0, value: 4
                key: 1, value: 1
                key: 2, value: 1
                * */
    }
}

댓글남기기