스트림은 데이터 소스를 추상화하고, 데이터를 자주 사용되는 메서드들을 정의해 놓았다.
데이터 소스를 추상화하였다는 것은, 데이터 소스가 무엇이던 간에 같은 방식(표준화된 방식)으로 다룰 수 있게 되었다는 것과 코드의 재사용성이 높아진다는 것을 의미한다.
스트림을 이용하면, 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 다룰 수 있다.
데이터 소스로 부터 데이터를 읽기만할 뿐, 변경하지 않는다.
필요하다면, 정렬된 결과를 컬렉션이나 배열에 담아서 반환한다.
한번 사용하면 닫혀서 다시 사용할 수 없다. 필요하다면 스트림을 다시 생성해야 한다.
내부 반복이라는 것은 반복문을 메서드의 내부에 숨길 수 있다는 것이다.
for(String str : strList) System.out.println(str);
↓
stream.forEach(System.out.println);
즉, forEach()는 메서드 안으로 for문을 넣은 것이다. 수행할 작업은 매개변수로 받는다.
마치 데이터베이스에 SELECT문으로 질의(쿼리, query)하는 것과 같은 느낌이다.
스트림이 제공하는 연산은 중간 연산과 최종 연산으로 분류할 수 있다.
스트림은 최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다.
중간 연산을 호출하는 것은 단지 어떤 작업이 수행되어야하는지를 지정해주는 것일 뿐이다.
최종 연산이 수행되어야 비로소 스트림의 요소들이 중간 연산을 거쳐 최종 연산에서 소모된다.
병렬 스트림은 스트림에 메서드를 호출만 하면 된다. 모든 스트림은 기본적으로 병렬 스트림이 아니다.
병렬처리가 항상 더 빠른 결과를 얻게 해주는 것은 아니다.