정리

스트림 API 가 제공하는 추상 개념 중 해심은 두가지 이다. 첫번째인 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다. 두번째인 스트림 파이프라인은 이 원소들로 수행한다는 연산 단계를 표현하는 개념이다.

스프림 파이프라인은 소스 스트림에서 시작해 종단연산(terminal operation)으로 끝나며, 그 사이에 하나이상의 중간 연산(intermediate operation)이 있을 수 있다.

스트림 파이프라인은 지연 평가 된다. 평가는 종단 연산이 호출될때 이뤄지며, 종단 연산에 쓰이지 않는 데이터 원소는 계산에 쓰이지 않는다.

스트림 API 는 메서드 연쇄를 지원하는 플루언트API(fluent API)다.

스트림을 제대로 사용하면 프로그램이 짧ㅅ고 깔끔해지지만 잘못사용하면 읽기 어렵고 유지보수도 힘들어진다.

람다에서는 타입이름을 자주 생략하므로 매개변수 이름을 잘 지어야 스트림 파이프라인의 가독ㄱ성이 유지된다.

char 값들을 처리할 때는 스트림을 삼가는 편이 낫다. 기존 코ㅡ는 스트림을 사용하도록 리팩터링하되, 새코드가 더 나아 보일때만 반영하자.

스트림 파이프라인은 되풀이 되는 계산을 함수 객체로 표현한다. 반면 반복코드에서는 코드 블록을 사용해 표현한다. 그런데 함수 객체로는 할 수 없지만, 코드블록으로는 할 수 있는 일들이 있다.

  • 코드블록에서는 범위 안에 지역변수를 읽고 수정할 수 있다. 하지만 람다에서는 final 이거나 사실상 final인 변수만 읽을 수 있고, 지역변수를 수정하는 건 불가능하다.
  • 코드블록에서는 return 문을 사용해 메서드에서 빠져나가거나, break나 continue 문으로 블록 바깥의 반복문으로 종료하거나 반복문을 한번 건너뛸 수 있다. 또한 메서드 선언에 명시된 검사예외를 던질 수 있다. 하지만 람다로는 이중 어느것도 할 수 없다.

핵심정리

스트림을 사용해야 멋지게 처리할 수 있는 일이있고, 반복 방식이 더 알맞은 일도 있다. 그리고 수많은 작업이 이 둘을 조합했을 때 가장 멋지게 해결된다. 어느 쪽을 선택하는 확고부동한 규칙은 없지만 참고할많나 지침 정도는 있다. 어느쪽이 나은지가 확연히 드러나는 경우가 많겠지만 아니더라도 방법은 있다. 스트림과 반복 중 어느쪽이 아은지 확신하기 어렵다면 둘다 해보고 더 나은 쪽을 택하라.