Stream
1 Stream 정의
- 스트림은 자바8부터 추가된 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다.
- Stream
-
sequence of elements supporting sequential and parallel aggregate operations
-
데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
-
1.1 연속된 요소
- 컬렉션과 마찬가지로 스트림은 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다
- 컬렉션은 자료구조이므로 시간과 공간의 복잡성과 괸련된 요소 저장 및 접근 연산이 주를 이룬다
- 반면에 스트림 filter, sorted, map처럼 표현 계산식이 주를 이룬다
- 즉 컬렌션의 주제는 데이터고 스트림의 주제는 계산이다.
1.2 소스
- 스트림은 컬렉션, 배열, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비한다.
- 정렬된 컬렌션으로 스트림을 생성하면 정렬이 그대로 유지된다.
1.3 데이터 처리 연산
- 스트림은 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산과 데이터베이스와 비슷한 연산을 지원한다.
- 예시 filter, map, reduce, find, match, sort 등으로 데이터를 조작할 수 있다.
- 스트림 연산은 순차적으로 또는 병렬로 실행할 수 있다.
2 스트림의 특징
Stream
은Iterator
와 비슷한 역할을 하는 반복자이지만 아래와 같은 차이점이 있다- 람다식으로 요소 처리 코드를 제공한다.
- 내부 반복자를 사용하므로 병렬 처리가 쉽다
- 멀티스레드 코드를 작성하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다.
- 중간 처리와 최종 처리 작업을 수행할 수 있다.
- 스트림이 처리하는 데이터 소스를 변경하지 않는다.
- 반복자와 마찬가지로 스트림으로 처리하는 데이터는 오직 한번만 처리한다.
- 탐색된 스트림의 요소는 소비된다.
- 한 번 탐색한 요소를 다시 탐색하려면 초기 데이터 소스에서 새로운 스트림을 만들어야한다.