요소를 그룹핑해서 수집
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 타입 합계 산출 |
스트림과 병렬 처리 (0) | 2024.02.21 |
---|---|
요소 수집 collect(), Collector Supplier (0) | 2024.02.20 |
컬렉션 Comparable, Comparator 인터페이스 구현 (0) | 2024.02.12 |
검색 기능에 좋은 컬렉션 TreeSet, TreeMap (1) | 2024.02.11 |
JPA 프록시 연관관계 관리 (1) | 2024.02.10 |
댓글 영역