Stream<T> — 순차·병렬 집계 연산을 지원하는 요소 시퀀스

Stream — 순차·병렬 집계 연산을 지원하는 요소 시퀀스

순차 및 병렬 집계 연산을 지원하는 요소 시퀀스를 나타내는 인터페이스예요. IntStream, LongStream, DoubleStream이 원시 타입 특화 버전이에요.

출처: Java API Reference

본문

public interface Stream<T> extends BaseStream<T, Stream<T>>

다음 예시는 StreamIntStream을 사용한 집계 연산으로, 빨간 위젯의 무게 합계를 계산해요:

int sum = widgets.stream()
                 .filter(w -> w.getColor() == RED)
                 .mapToInt(w -> w.getWeight())
                 .sum();

여기서 widgetsCollection<Widget>이고, Collection.stream()으로 Widget 객체의 스트림을 만들고, 빨간 위젯만 포함하도록 필터링한 뒤 각 위젯의 무게를 나타내는 int 값 스트림으로 변환해서 합산해요.

스트림 파이프라인

계산을 수행하려면 스트림 연산을 스트림 파이프라인으로 구성해요. 파이프라인은 소스(배열, 컬렉션, 생성기 함수, I/O 채널 등), 0개 이상의 중간 연산(filter(Predicate)처럼 스트림을 다른 스트림으로 변환), 그리고 결과나 부수 효과를 내는 터미널 연산(count()forEach(Consumer))으로 구성돼요.

스트림은 지연(lazy) 되어, 터미널 연산이 시작될 때만 소스 데이터에 대한 계산이 수행되고 소스 요소는 필요한 만큼만 소비돼요.

주요 중간 연산

  • filter(Predicate<? super T> predicate) — 주어진 조건과 일치하는 요소로 구성된 스트림을 반환해요.
  • map(Function<? super T, ? extends R> mapper) — 주어진 함수를 적용한 결과로 구성된 스트림을 반환해요.
  • mapToInt(...) / mapToLong(...) / mapToDouble(...) — 원시 타입 특화 스트림으로 변환해요.
  • flatMap(...) — 각 요소를 스트림으로 매핑해 요소들을 하나로 합쳐요.
  • distinct() — 중복이 제거된 요소로 구성된 스트림을 반환해요.
  • sorted() / sorted(Comparator) — 요소를 정렬한 스트림을 반환해요.
  • peek(Consumer) — 각 요소를 소비하면서 요소들을 구성한 스트림을 반환해요.
  • limit(long maxSize) / skip(long n) — 요소 수를 제한하거나 앞의 요소를 건너뛰어요.
  • takeWhile(...) / dropWhile(...) — 조건이 참인 동안 요소를 취하거나 버려요.

주요 터미널 연산

  • forEach(Consumer) / forEachOrdered(Consumer) — 각 요소에 대해 동작을 수행해요.

  • count() — 이 스트림의 요소 수를 반환해요.

  • collect(Collector) — 가변 리덕션을 수행해요.

  • reduce(...) — 요소를 축소해 단일 값으로 결합해요.

  • min(Comparator) / max(Comparator) — 최소·최대 요소를 반환해요.

  • anyMatch(Predicate) / allMatch(Predicate) / noneMatch(Predicate) — 요소가 조건과 일치하는지 검사해요.

  • findFirst() / findAny() — 첫 요소 또는 아무 요소를 반환해요.

  • toList() — 요소를 List로 수집해요.

  • 도입 시점(Since): 1.8

더 알아보기 (Learn more)