4.1 스트림이란 무엇인가
- 자바 8 API에 새로 추가된 기능
- 선언형으로 컬렉션 데이터 처리(DB에 질의하듯이)
- 어떻게 동작을 구현할지 지정할 필요 없이 ‘저칼로리의 요리만 선택하라’ 같은 동작의 수행을 지정할 수 있다.
- 멀티스레드 코드를 구헌 하지 않아도 데이터를 투명하게 병렬로 처리 가능
- parallelStream()
- 여러 빌딩 블록 연산을 파이프 라인으로 연결해 가독성과 명확성을 유지하며 작성이 가능하다.
- filter(sorted, map collect)와 같은 연산은 고수준 빌딩 블록으로 이루어져 있어서 특정 스레딩 모델에 제한되지 않는다. (내부적으로 단일 스레드 모델에 사용할 수 있지만 멀티코어 아키텍처를 최대한 투명하게 활용할 수 있게 구현되어 있다.)
- 결과적으로 데이터 처리를 병렬화하면서 스레드와 락을 걱정할 필요가 없다.
- 스트림 API의 특징 요약
- 선언형 – 간결, 가독성 좋음
- 조립 가능 – 유연함
- 병렬화– 성능 좋음
4.2 스트림 시작하기
- 스트림 정의 – 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
- 연속된 요소 – 컬렉션과 마찬가지로 특정 요소 형식으로 이루어진 연속된 집합의 인터페이스. 컬렉션이 시간, 공간의 복잡성과 관련된 요소 저장 및 접근 연산이 주를 이룬다면 스트림은 데이터와 계산이 주를 이룬다.
- 소스 – 스트림은 데이터 제공 소스로부터 데이터를 소비한다. 정렬된 컬렉션으로 스트림을 생성하면 정렬이 유지된다.
- 데이터 처리 연산 – 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산과 DB와 비슷한 연산을 지원한다.
- 파이프라이닝 – 스트림 연산끼리 연결해서 파이프라인을 구성하도록 자신을 반환한다. 덕분에 게으름(laziness), 쇼트서킷(short-circuiting) 같은 최적화가 가능
- 내부 반복 – 명시적으로 반복하는 컬렉션과 달리 스트림은 내부 반복 지원
4.3 스트림과 컬렉션
- 데이터를 언제 계산하느냐가 컬렉션과 스트림의 가장 큰 차이다.
- 컬렉션의 모든 요소는 컬렉션에 추가하기 전에 계산되어야 한다.
- 컬렉션에 요소를 추가하거나 삭제할 때 모든 요소를 메모리에 저장해야 하며 요소는 추가되기 전에 계산되어야 한다.
- 스트림은 이론적으로 요청할 때만 요소를 계산하는 고정된 자료구조다.
- 스트림은 게으르게 만들어지는 컬렉션과 같다.
- 예시
- 컬렉션은 DVD에 저장된 영화다. (적극적 생성)
- DVD처럼 모든 값을 계산한 다음에 컬렉션에 추가할 수 있는 것이다.
- 스트림은 인터넷으로 스트리밍하는 영화다. (게으른 생성)
- 사용자가 시청하는 부분의 몇 프레임을 미리 내려받고 다른 대부분의 값을 처리하지 않은 상태에서 미리 받은 프레임부터 재생할 수 있다.
- 컬렉션은 DVD에 저장된 영화다. (적극적 생성)
- 반복자와 마찬가지로 한 번 탐색한 요소는 다시 탐색할 수 없다.
- 외부 반복 - 컬렉션 인터페이스에선 사용자가 직접 요소를 반복해야 한다. (for-each)
- 외부 반복에서는 병렬성을 스스로 관리해야 한다.
- (병렬성을 포기하든지, synchronized를 사용하든지)
- 내부 반복 – 반복을 알아서 처리하고 결과 스트림 값을 어딘 가에 저장해준다.
- 내부 반복을 이용하면 작업을 투명하게 병렬로 처리하거나 더 최적화된 다양한 순서로 처리할 수 있다.
- 데이터 표현과 하드웨어를 활용한 병렬성 구현을 자동으로 선택한다.
4.4 스트림 연산
- 중간 연산 - 파이프라인으로 연결할 수 있는 스트림 연산.
- 최종 연산 – 스트림 연산을 닫는 연산
- 중간 연산을 연결해 질의를 만들 수 있다.
- 단말 연산을 스트림 파이프라인에 실행하기 전까지 아무 연산도 수행하지 않는다. (게으름)
- 중간 연산을 합친 다음 최종 연산으로 한 번에 처리
참고 - 모던 자바 인 액션
'개발 서적 > 모던 자바 인 액션' 카테고리의 다른 글
[모던 자바 인 액션] Chapter13. 디폴트 메서드 (0) | 2022.04.05 |
---|---|
[모던 자바 인 액션] Chapter11. Null 대신 Optional 클래스 (0) | 2022.03.28 |
[모던 자바 인 액션] Chapter7. 병렬 데이터 처리와 성능 (0) | 2022.03.02 |