Stream은 자바 8부터 추가된 기능으로 컬렉션, 배열등의 저장 요소를 하나씩 참조하여 함수형 인터페이스(lambda expression)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능

왜 사용하는가? 불필요한 코딩(for, if 문법)을 걷어낼 수 있고 직관적이기 때문에 가독성이 좋아진다.

Stream 특징

  • 원본의 데이터를 변경하지 않는다.

Stream API는 원본의 데이터를 조회하여 원본의 데이터가 아닌 별도의 요소들로 Stream을 생성한다. 그렇기 때문에 원본의 데이터로부터 읽기만 할 뿐이며, 정렬이나 필터링 등의 작업은 별도의 Stream 요소들에서 처리가 된다.

  • 일회용이다.

Stream은 일회용이기 때문에 한번 사용이 끝나면 재사용이 불가능하다. Stream이 또 필요한 경우 다시 생성해야하며, 재사용을 한다면 IllegalStateException이 발생한다.

  • 내부 반복으로 작업을 처리한다.

Stream 중간연산

연산 결과를 스트림으로 반환하기 때문에 중간 연산을 연속해서 할 수 있다.

  • filter

    • 조건에 맞게 거르는 것
  • map

    • 원하는 필드만 뽑아내거나 특정 형태로 변환할 때 사용
    Stream<R> map(Function<? super T, ? extends R> mapper);
    
  • peek

  • sorted

  • limit

  • distinct

  • skip

  • mapToInt, mapToLong, mapToDouble…

Stream 최종연산

스트림의 요소를 소모하면서 연산을 수행하기 때문에 한번만 연산이 가능하다

  • count(), min(), max(), sum(), average()
  • reduce()
    • 스트림의 요소를 줄여나가면서 연산을 수행하고 최종결과를 반환
  • forEach()
  • collect()
    • reduce()와 유사하나, collect()는 매개변수 타입이 Collector이다.
  • iterator()+

parallel stream

내부적으로 fork & join 프레임워크를 이용해서 자동적으로 연산을 병렬로 수행한다.

여러 쓰레드가 스트림에서 요소를 필터링하고 나온 요소 수를 계산하고 쓰레드끼리 다시 한 번 각자 계산한 값들을 더해서 return 해준다.

참고 자료