상세 컨텐츠

본문 제목

요소 그룹핑, 집계 Collector groupingByConcurrent

기록 - 프로그래밍/Java

by wjjun 2024. 2. 13. 12:25

본문

 

요소를 그룹핑해서 수집

collect() 메서드는 단순히 요소 수집 기능 이외에 컬렉션 요소들을 그룹핑해서 Map 객체를 생성하는 기능도 제공합니다.

collect()를 호출할 때 Collectors의 groupingBy() 또는 groupingByConcurrent()가 리턴하는 Collector를 매개값으로 대입하면 됩니다.

 

groupingBy()는 스레드에 안전하지 않은 Map을 생성

groupingByConcurrent()는 스레드에 안전한 ConcurrentMap을 생성

 

리턴타입 Collectors의 정적메서드 설명
Collector<T, ?, Map<K, List<T>>> groupingBy(Function<T, K> classifier) T를 K로 매핑해서 K키에 저장된 List에 T를 저장한 Map 생성
Collector<T, ?, ConcurrentMap<K, List<T>>> groupingByConcurrent(Function<T, K> classifier)
Collector<T, ?, ConcurrentMap<K, D>> groupingByConcurrent(
    Function<T, K> classifier,
    Collector<T, A, D> collector
)
T를 K로 매핑하고 K키에 저장된
D객체에 T를 누적한 Map 생성
Collector<T, ?, Map<K, D>> groupingByConcurrent(
    Function<T, K> classifier,
    Supplier<Map<K,D>> mapFactory,
    Collector<T,A,D> collector
)
Collector<T, ?, Map<K,D>> groupingBy(
    Function<T, K> classifier,
    Supplier<Map<K,D> mapFactory,
    Collector<T,A,D> collector
)
T를 K로 매핑하고 Supplier가 제공하는 Map에서 K키에 저장된 D객체에 T를 누적
Collector<T, ?, ConcurrentMap<K,D>> groupingByConcurrent(
    Function(T, K) classifier,
    Supplier(ConcurrentMap<K,D>>
    mapFactory,
    Collector<T,A,D> collector
)

 

학생들을 성별로 그룹핑하고 같은 그룹에 속하는 학생 List를 생성한 후 성별을 키로, 학생 List를 값으로 갖는 Map을 생성한다. collect() 매개값으로 groupingBy(Function<T, K> classifier)를 사용했다.

1. Stream<Student> totalStream = totalList.stream();
2. Function<Student, Student.Sex> classifier = Student :: getSex;
3. Collector<Student, ?, Map<Student.Sex, List<Student>>> collector = Collectors.groupingBy(classifier);
4. Map<Student.Sex, List<Student>> mapBySex = totalStream.collect(collector);

 

변수 생략하고 간단하게 작성하면

Map<Student.Sex, List<Student>> mapBySex = totalList.stream().collect(Collectors.groupingBy(Student :: getSex));

 

도시별로 그룹핑하고 같은 그룹에 속하는 학생들 이름 List 생성후 거주 도시를 키로, 이름 List를 값으로 갖는 Map을 생성한다.

1. Stream<Student> totalStream = totalList.stream();
2. Function<Student, Student.City> classifier = Student::getCity;
3. Function<Student, String> mapper = Student::getName;
4. Collector<String, ?, List<String>> collector1 = Collector.toList();
5. Collector<Student, ?, List<String> collector2 = Collector.mapping(mapper, collector1);
6. Collector<Student, ?, Map<Student.City, List<String>>> collector3 = 
    Collectors.groupingBy(classifier, collector2);
7. Map<Student.City, List<String>> mapByCity = totalStream.collect(colletor3);

 

간단하게 작성하면

Map<Student.City, List<String>> mapByCity = totalStream.stream()
    .collect(
        Collectors.groupingBy(
            Student :: getName,
            Collectors.mapping(Student::getName, Collectors.toList())
        )
);

 

그룹 후 매핑 집계

리턴타입 메서드 설명
Collector<T, ?, R> mapping (
    Function<T, U> mapper,
    Collector<U, A, R> collector)
T를 U로 매핑한 후, U를 R에 수집
Collector<T, ?, Double> averagingDouble (
    ToDoubleFunction<T> mapper)
T를 Double로 매핑한 후 Double의 평균값을 산출
Collector<T, ?, Long> counting() T의 카운팅 수를 산출
Collector<CharSequenc,?,String> joining(CharSequence delimiter) CharSequence를 구분자
(delimiter)로 연결한 Strign을 산출
Collector<T, ?, Optional<T>> mapBy(
    Comparator<T> comparator)
Comparator를 이용해서 최대 T를 산출
Collector<T, ?, Integer> summingInt(ToIntFunction)
summingLong(ToLongFunction)
summingDouble(ToDoubleFunction)
int, Long, Double 타입 합계 산출

 

관련글 더보기

댓글 영역