스트림(Stream) : 컬렉션의 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자
- 스트림의 특징
- 람다식으로 요소 처리 코드를 제공함 (람다식이나 메소드 참조를 이용해서 요소 처리 내용을 매개값으로 전달 가능)
- 내부 반복자(컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리 코드만 제공하는 iterator 패턴)를 사용하여 병렬 처리가 쉽다(멀티코어 CPU를 활용하기 위해 컬렉션에서 요소들을 분배시켜 병렬 작업을 할 수 있게 도와줌)
- 컬렉션 요소에 대해 중간 처리(매핑, 필터링, 정렬, 그룹핑...)와 최종 처리(반복, 카운팅, 평균, 총합, 매칭여부확인 등 집계처리)를 할 수 있다. (대량의 데이터를 가공하여 축소; Reduction)
스트림 파이프라인 : 여러 개의 스트림이 연결되어 있는 구조
// 스트림 파이프라인 코드 예시
double ageAge = list.stream() // 오리지널 스트림
.filter(m -> m.getSex()==Member.MALE) // 중간 처리 스트림(필터링)
.mapToInt(Member :: getAge) // 중간 처리 스트림(매핑)
.average() // 최종 처리
.getAsDouble();
- 병렬 처리 성능에 영향을 미치는 3가지 요인
1. 요소 수와 요소당 처리 시간 (병렬처리는 스레드풀, 스레드 생성에 비용이 소요되기 때문에 컬렉션 요소 수가 적고 요소당 처리 시간이 짧으면 순차처리가 더 빠를 수 있음)
2. 스트림 소스 종류 (인덱스로 요소를 관리하는 ArrayList, 배열 등은 포크 단계에서 요소 분리가 쉬워서 병렬 처리 시간이 절약됨. 반면 HashSet, TreeSet, LinkedList 등은 요소 분리가 쉽지 않음)
3. Core 수 (많을수록 좋다)
참고문헌
이것이 자바다