본 포스팅은 [이것이 자바다]의 내용을 참고하여 작성하였습니다.
16.11 수집: collect()
- 요소들을 필터링 또는 매핑한 후 수집하는 최종 처리 메소드.
- 필요한 요소만 컬렉션으로 담을 수 있다.
- 요소들을 그룹핑한 후 집계(리덕션)할 수 있다.
16.11.1 필터링한 요소 수집
collect(Collector<T, A, R> collector) 메소드는 필터링 또는 매핑된 요소들을 새로운 컬렉션에 수집하여 리턴한다.
위의 매개값인 Collector(수집기)는 어떤 요소를 어떤 컬렉션에 수집할 것인지를 결정한다.
Collector의 타입 파라미터 T는 요소, A는 누적기, R은 요소가 저장될 컬렉션이다.
풀어서 해석하면, T 요소를 A 누적기가 R에 저장한다 는 의미이다.
다음과 같이 다양한 정적 메소드를 이용하여 Collector의 구현 객체를 얻을 수 있다.
A(누적기)가 ?로 되어있는 것은 Collector가 R에 T를 저장하는 법을 알고 있어 A가 필요 없기 때문이다.
Map과 ConurrentMap의 차이점은 Map은 스레드에 안전하지 않고, ConcurrentMap은 스레드에 안전하다.
-> 멀티스레드 환경에서 사용하려면 ConcurrentMap을 사용하는 것이 좋다.
예제) 전체 학생 중에 남학생들만 필터링해서 List 생성하기
Stream<Student> totalStream = totalList.stream();
Stream<Student> maleStream = totalStream.filter(s->s.getGender()==Student.Gender.MALE)
Collector<Student, ?, List<Student>> collector = Collectors.toList();
List<Student> maleList = maleStream.collect(collector);
위 코드에서 변수를 생략하면 다음과 같이 간단하게 작성할 수 있다.
List<Student> maleList = total.stream()
.filter(s->s.getGender() == Student.Gender.MALE)
.collect(Collectors.toList());
16.11.2 사용자 정의 컨테이너에 수집하기
스트림은 요소들을 필터링 또는 매핑해서 사용자 정의 컨테이너 객체에 수집할 수 있도록 다음과 같은 collect() 메소드를 추가적으로 제공한다.
첫 번째 Supplier는 요소들이 수집될 컨테이너 객체(R)를 생성하는 역할을 한다.
두 번째 XXXConsumer는 컨테이너 객체(R)에 요소(T)를 수집하는 역할을 한다.
세 번째 BiConsumer는 컨테이너 객체(R)를 결합하는 역할을 한다.
예제) 사용자 정의 컨테이너인 MaleStudent에 남학생만 수집하기
MaleStudent maleStudent = totalList.stream()
.filter(s->s.getGender() == Student.Gender.MALE)
.collect(MaleStudent :: new, MaleStudent :: accumulate, MaleStudent :: combine);
16.11.3 요소를 그룹핑해서 수집
collect() 메소드는 요소를 수집하는 기능 외에도, 컬렉션의 요소들을 그룹핑해서 Map 객체를 생성할 수 있다.
collect()를 호출할 때 Collectors의 groupingBy() 또는 groupingByConcurrent()가 리턴하는 Collector를 매개값으로 대입하면 된다. (groupingBy()는 스레드에 안전하지 않은 Map을, groupingByConcurrent()는 스레드에 안전한 ConcurrentMap을 생성)
16.11.4 그룹핑 후 매핑 및 집계
Collectors.groupingBy()메소드는 그룹핑 후 매핑이나 집계를 할 수 있도록 두 번째 매개값으로 Collector를 가질 수 있다.
'Study in SSAFY > 이것이 자바다' 카테고리의 다른 글
[이것이 자바다] 12.6 멀티스레드 - 스레드 상태 제어 (0) | 2022.09.12 |
---|---|
[이것이 자바다] 12.5 멀티스레드 - 스레드 상태 (0) | 2022.09.12 |
[이것이 자바다] 12.4 멀티스레드 - 동기화 메소드와 동기화 블록 (0) | 2022.09.12 |
[이것이 자바다] 11. 기본 API 클래스(Math~Formatting) (0) | 2022.08.10 |
[이것이 자바다] 10. 예외 처리 (0) | 2022.07.31 |