Stream
이전 자바 버전에서는 스레드 API로 멀티스레드를 구현해서 병렬성을 이용하는것은 쉽지 않았다.
자바 8에는 Stream이 라는게 있는데 이것은 위에 말한것을 보안한 컬렉션을 처리하면서 발생하는 모호함(스레드를 잘 제어하지 못하면 원하는 데이터를 얻을 수 없는 모호함)과 반복적인 코드 문제 그리고 멀티코어 활용 어려움이라는 두가지 문제를 해결했다.
데이터를 필터링 하거나 추출하거나 그룹화를 할수있다 그리고 이러한 동작들을 쉽게 병렬 처리 할 수 있다.
멀티코어 컴퓨터 : 단일 cpu 가 아닌 넷 또는 여덟개 이상의 cpu를 갖는 컴퓨터를 말한다.
cpu를 가진 환경에서 리스트를 필터링할 때 한 cpu는 앞부분을 처리하고 한 cpu는 뒷부분을 처리하도록 요청할 수 있는데
이 과정을 포킹단계(cpu가 각자 처리할 앞부분과 뒷부분을 나누는 단계)라고 한다.
필터에서는 자신이 맡은 절반의 리스트(포킹단계에서 나눈 리스트)를 처리한다.
마지막으로 하나의 cpu가 두 결과를 정리한다(마지막 단계인 결과 합침).
컬렉션은 어떻게 데이터를 저장하고 접근할지에 중점을 두는 반면 스트림은 데이터에 어떤 계산을 할 것인지 묘사하는 것에 중점을 둔다는 점을 기억하자. 스트림은 스트림 내의 요소를 쉽게 병렬로 처리 할 수있는 환경을 제공한다는 것이 핵심이다.
컬렉션을 필터링 할 수있는 가장 빠른 방법은 컬렉션을 스트림으로 바꾸고 병렬로 처리한 다음에 리스트로 다시 복원하는 것이다.
스트림과 람다 표현식을 이용하면 병렬성을 공짜로 얻을 수 있으며 리스트에서 원하는 리스트들을 순차적으로 또는 병렬로 필터링 할 수있다.