Effective Java 3rd ITEM 45

ITEM 45. Use streams judiciously

스트림 API

java8에 다량의 데이터 처리 작업을 돕고자 추가되었다. 스트림 안의 데이터 원소들은 객체 참조나 int, long, double의 기본 타입 값이다.

  1. 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다.
  2. 스트림 파이프라인은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다.
  3. 메서드 연쇄를 지원하는 fluent API이다.

스트림 파이프라인

  1. 소스 스트림에서 시작해 종단 연산으로 끝난다. 중간 연산들은 스트림을 변환하는 역할을 한다.
  2. 지연 평가(lazy evaluation)된다. 평가는 종단 연산이 호출될 때 이뤄진다.
    -> 지연 평가이기에 무한 스트림을 다룰 수 있다.
  3. 기본적으로느 순차적으로 수행되는데 병렬로 실행하려면 parallel 메서드를 호출해주면 된다.

스트림과 맞는 시퀀스

  1. 원소들의 시퀀스를 일관되게 반환한다.
  2. 원소들의 시퀀스를 필터링한다.
  3. 원소들의 시퀀스를 하나의 연산을 사용해 결합한다.
  4. 원소들의 시퀀스를 컬렉션에 모은다.
  5. 원소들의 시퀀스에서 특정 조건을 만족하는 원소를 찾는다.



스트림 API는 모든 계산을 할 수 있지만 모두 스트림으로 해야 한다는 것은 아니다. 스트림을 사용했을 때 읽기 어렵고 유지보수가 힘들어질 수 있다. 기존 코드는 스트림을 사용하도록 리팩터링하되, 새 코드가 더 나아 보일 때만 반영하자. 스트림과 반복 중 어느 쪽이 나은지 확신하기 어렵다면 둘 다 해보고 나은 쪽을 선택하자.