hiflo
하이플로
hiflo
전체 방문자
오늘
어제
  • 분류 전체보기 (33)
    • 이런 분과 함께하고 싶어요 🙋‍♂️ (0)
    • Study in SSAFY (28)
      • Java Programming (2)
      • 이것이 자바다 (7)
      • Algorithm (2)
      • 면접을 위한 CS 전공지식 노트 (10)
      • Computer Science (7)
    • 기록들 (4)
    • 잡담 (1)

블로그 메뉴

  • 📷 Instagram
  • 🔧 관리자

인기 글

태그

  • 선언형프로그래밍
  • 팩토리패턴
  • 2의보수
  • 싱글톤패턴
  • 가중치코드
  • 절차형프로그래밍
  • SSAFY 9기
  • ssafy 면접
  • complements
  • 프로그래밍패러다임
  • 비가중치코드
  • 싸피
  • 노출모듈패턴
  • 삼성청년SW아카데미
  • 백준
  • mvp패턴
  • 함수형프로그래밍
  • 비선형자료구조
  • 전략패턴
  • 디자인패턴
  • SSAFY
  • 자료구조
  • MVVM패턴
  • 이터레이터패턴
  • 우선순위큐
  • 선형자료구조
  • 프록시패턴
  • 수치코드
  • 해시테이블
  • 영문숫자코드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
hiflo
Study in SSAFY/이것이 자바다

[이것이 자바다] 16.11 스트림과 병렬처리 - 수집(collect())

[이것이 자바다] 16.11 스트림과 병렬처리 - 수집(collect())
Study in SSAFY/이것이 자바다

[이것이 자바다] 16.11 스트림과 병렬처리 - 수집(collect())

2022. 9. 14. 19:31

본 포스팅은 [이것이 자바다]의 내용을 참고하여 작성하였습니다.


 

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
  • 16.11 수집: collect()
  • 16.11.1 필터링한 요소 수집
  • 16.11.2 사용자 정의 컨테이너에 수집하기
  • 16.11.3 요소를 그룹핑해서 수집
  • 16.11.4 그룹핑 후 매핑 및 집계
'Study in SSAFY/이것이 자바다' 카테고리의 다른 글
  • [이것이 자바다] 12.6 멀티스레드 - 스레드 상태 제어
  • [이것이 자바다] 12.5 멀티스레드 - 스레드 상태
  • [이것이 자바다] 12.4 멀티스레드 - 동기화 메소드와 동기화 블록
  • [이것이 자바다] 11. 기본 API 클래스(Math~Formatting)
hiflo
hiflo
자극을 엔진으로 삼는

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.