스트림은 주의해서 사용하라
스트림 API?
- 다량의 데이터 처리 작업(순차, 병렬 상관 X)을 돕기 위해 Java 8에서 추가된 개념
- 핵심 추상 개념
- 스트림: 데이터 원소의 유한 혹은 무한 시퀀스(sequence)를 뜻함
- 스트림 파이프라인: 이 원소들로 수행할 수 있는 연산 단계
- 스트림의 원소들은 어디로부터든 올 수 있음
- 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기 등
- 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다.
- 기본 타입 값 중 지원되는 타입: int, long, double
스트림 파이프라인
간단 요약: 중간의 transform 연산은 action이 일어나기 전까지는 행동하지 않는다. 고로 action function을 통해 실제 연산이 일어나게 해야 한다.
- 소스 스트림 → 종단 연산으로 끝나는 하나의 흐름으로 이루어짐
- 중간에 하나 이상의 중간 연산(intermediate operation)이 존재 → 스트림을 transform 한다.
- 중간 연산들은 한 스트림을 다른 스트림으로 변환
- 데이터 타입은 같을 수도, 다를 수(대표적으로 map)도 있다
- 종단 연산(action)은 최종 중간 연산이 일어난 후의 스트림에 최후의 연산을 가함.
- 정렬해 컬렉션에 담는다.
- 특정 원소 하나를 선택한다.
- 모든 원소를 출력한다.
- 기타
Lazy Evaluation?
- 스트림 파이프라인은 지연 평가(lazy evaluation, 혹은 lazy execution이라 불림)된다.
- 평가는 종단 연산이 호출될 때 이뤄짐
- 종단 연산에 쓰이지 않는 데이터 원소 → 계산에 쓰이지 않음
- 지연 평가로 인해 무한 스트림을 다룰 수 있게 됨
- 종단 연산(action)이 없는 스트림 파이프라인은 아무 일도 하지 않는다.
- 같이 알아두면 좋은 참고글들(Scala, Spark)