Java 8에 새로 추가된 기능이다. 요점만 쉽게 말하자면 스트림은 데이터 컬렉션의 반복을 조금더 쉽고 가독성 좋은 방식으로 처리하는 기능이라고 생각하면 된다.
스트림을 '데이터의 흐름'이라고 표현하기도 하는데 filter, map, collect 등의 연산들을 정의 시 정의한 순서대로 타고 따라가며 마치 데이터가 파이프라인을 타고 연산을 수행하는 것과 같은 모습으로 볼 수도 있다. 또한, 스트림을 이용하면 멀티스레드를 위해 코드를 따로 구현하지 않아도 병렬로 쉽게 데이터를 처리할 수 있다.
기본적으로 Stream과 Collection은 연속된 요소 형식의 값을 저장하는 자료구조 인터페이스를 제공한다. 그렇다면 무엇이 다르기에 둘은 나눠진걸까?
둘의 가장 큰 차이점으로는 '계산 시점의 차이'가 있다.
Collection: 모든 요소는 컬렉션에 추가하기 전에 계산이 완료되어야 한다.
Stream: 요청할 때만 요소를 계산하는 고정된 자료구조(Stream에 요소를 추가/삭제 불가)이다.
Collection은 데이터를 어떻게 잘 저장하고 접근할 것이냐에 초점을 두었고 Stream의 경우 어떻게 처리할 것인가에 초점을 두었다.
Collection은 내부 요소에 대해 처리를 하기 위해서는 외부적으로 for-each 반복문을 통해 데이터에 접근하고 비지니스 로직을 통해 처리해야 했다. 즉, 무언가 처리를 하기 위해 Collection 내부에 모든 값을 가지고 있어야 한다.
반면, Stream의 경우 어떻게 처리할 것인가에 초점을 두었다. Stream은 Collection이 외부 비지니스 로직을 통해 데이터를 처리하는 방법 대신 내부적으로 반복 과정을 숨겨 알아서 데이터를 처리하고 결과를 출력하는 과정을 수행한다. 내부적으로 반복하기 때문에 실제 사용할 때 순차/병렬에 대한 처리를 간단하게 설정할 수 있게 되었다.