Stream API?
자바8에 추가된 기능으로, 스트림 형태의 요소에 함수형 연산자를 지원해주는 클래스이다. 다양한 데이터 소스를 표준화된 방법으로 다룰 수 있다.
stream
을 직역하면 "흐름"이라는 뜻인데, 자바에서는 데이터 요소들의 흐름을 의미한다. 즉, List, Map, Set 과 같은 Collection Framework
또는 배열
과 같은 데이터 소스가 있을 때, 이들의 요소들이 스트림을 통해 하나씩 전달되어 연산을 거친다는 것이다.
중간연산, 최종연산
스트림이 한번 생성되면 스트림을 생성한 제너릭 타입에 상관없이 모두 같은 방식으로 연산을 적용시킬 수 있다.
- 중간 연산: 연산 결과가 스트림인 연산으로 0~n번 수행할 수 있다.
- 최종 연산: 연산 결과가 스트림이 아닌 연산으로 0~1번만 수행할 수 있다.
중간 연산, 최종 연산의 종류는 공식문서에서 확인할 수 있다.
특징
- 스트림은 재사용할 수 없다. 최종 연산 후에는 스트림이 닫히기 때문에 필요시엔 스트림을 재생성해야한다.
- 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다.
- 지연 연산을 수행하여 작업을 최적화한다. 즉, 최종 연산이 수행되기 전까지 중간연산은 수행되지 않고, 어떤 연산을 수행해야하는지만 확인하는 작업을 거친 후 최종연산 수행 시 같이 수행된다. (참고: [Java]지연연산과 최적화)
- 병렬 스트림으로 전환하여 스트림 작업을 병렬로 처리할 수 있다. (
parallel()
)
- IntStream, LongStream, DoubleStream등과 같은 기본형 스트림을 제공하여 기본형-참조형 간 오토박싱, 언박싱의 비효율성을 제거할 수 있다.
참고
[자바의 정석 - 기초편] ch14-15,16 스트림, 스트림의 특징