데이터를 다룰 때 컬렉션과 배열을 사용하는데 각 컬렉션 마다 같은 기능을 하는 메서드들이 중복 정의되어있다. 이런 문제점을 해결하기 위해 나온 것이 스트림이다.
스트림은 데이터 소스(배열, 컬렉션, 파일 등)를 추상화하고 데이터를 다루는데 자주 사용되는 메서드들을 따로 정의해놓았다. 즉, 데이터 소스가 무엇이든 간에 동일한 방법으로 다룰 수 있으며 재사용성도 높아졌다.
스트림은 데이터 소스로부터 데이터를 읽어오는 것이지, 데이터 소스 자체를 변경하지는 않는다. 하지만 새로운 데이터 소스를 생성하여 결과를 반환할 수는 있다.
List<String> sortList = stringStream.sorted().collect(Collectores.toList());
Iterator와 마찬가지로 일회용이다. 한 번 사용하면 다시 사용할 수 없으므로 새로운 스트림을 생성해야한다.
스트림은 중간연산과 최종연산으로 이루어져있다.
Stream<T>
이며 중간 연산은 계속 연결할 수 있다.중간 연산은 최종 연산이 수행되기 전까지는 미리 수행되지 않는다.
기본적으로 스트림은 병렬로 처리하지 않는다. 병렬 처리를 하려면 parallel()
메서드를 스트림에서 호출해주면 된다.