16.1 스트림이란?
- Java 8 부터 컬렉션 및 배열의 요소를 반복 처리하기 위해 스트림 사용
- 요소들이 하나씩 흘러가면서 처리된다는 의미
Stream<String> stream = list.stream();
stream.forEach( item ->
- List 컬렉션의 stream() 메소드로 Stream 메소드를 얻고, forEach() 메소드로 요소를 어떻게 처리할지를 람다식으로 제공
- 스트림과 Iterator 차이점
1) 내부 반복자이므로 처리 속도가 빠르고 병렬 처리에 효율적
2) 람다식으로 다양한 요소 처리를 정의
3) 중간 처리와 최종 처리를 수행하도록 파이프 라인을 형성
16.2 내부 반복자
- 요소 처리 방법을 컬렉션 내부로 주입시켜서 요소를 반복 처리
- 개발자 코드에서 제공한 데이터 처리 코드(람다식)를 가지고 컬렉션 내부에서 요소를 반복 처리
- 내부 반복자는 멀티 코어 CPU를 최대한 활용하기 위해 요소들을 분배시켜 병렬 작업 가능

16.3 중간 처리와 최종 처리
16.3.1 스트림 파이프라인
-
컬렉션의 오리지널 스트림 뒤에 필터링 중간 스트림이 연결될 수 있고, 그 뒤에 매핑 중간 스트림이 연결될 수 있음.

-
오리지널 스트림과 집계 처리 사이의 중간 스트림들은 최종 처리를 위해 요소를 걸러내거나(필터링), 요소를 변환시키거나(매핑), 정렬하는 작업을 수행.
-
최종 처리는 중간 처리에서 정제된 요소들을 반복하거나, 집계(카운팅, 총합, 평균) 작업을 수행

16.3.2 스트림 인터페이스
- java.util.stream 패키지에는 BaseStream 인터페이스를 부모로 한 자식 인터페이스들은 상속 관계
- BaseStream에는 모든 스트림에서 사용할 수 있는 공통 메소드들이 정의

16.4 리소스로부터 스트림 얻기
16.4.1 컬렉션으로부터 스트림 얻기
16.4.2 배열로부터 스트림 얻기
16.4.3 숫자 범위로부터 스트림 얻기
16.4.4 파일로부터 스트림 얻기
16.5 요소 걸러내기(필터링)
16.6 요소 변환(매핑)
16.7 요소 정렬
16.8 요소를 하나씩 처리(루핑)
16.9 요소 조건 만족 여부(매칭)
16.10 요소 기본 집계
16.11 요소 커스텀 집계
16.12 요소 수집
16.13 요소 병렬 처리