Java의 스트림(Stream)은 데이터의 흐름을 통해 선언적으로 데이터를 처리하는 기능이다. 스트림의 주요 특징은 다음과 같다.

  • 지연 평가: 최종 연산이 호출될 때까지 중간 연산을 지연시킨다.
  • 내부 반복: 명시적인 반복문을 제거할 수 있다.
  • 병렬 처리: parallelStream 메서드로 간단히 병렬 처리할 수 있다.

다음 예제는 스트림을 사용하여 int 자료형의 배열 data에 대해 일련의 연산을 적용한다. 메서드 체이닝을 통해 여러 연산을 적용하고, 람다 표현식을 메서드 매개변수에 전달해서 구체적인 연산 방법을 제공하기도 한다.

import java.util.Arrays;
import java.util.Comparator;
 
public class Sample {
    public static void main(String[] args) {
        int[] data = {1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 10};
 
        int[] result = Arrays
                .stream(data)
                .boxed() // Stream<Integer>로 변환
                .filter((x) -> x % 2 == 0)
                .distinct()
                .sorted(Comparator.reverseOrder()) // Stream<Integer> 전용 메서드
                .mapToInt(Integer::intValue) // IntStream으로 변환
                .toArray();
 
        for (int r : result) {
            System.out.println(r);
        }
    }
}
 

스트림 처리 과정

스트림은 다음 세 단계에 걸쳐 최종적인 결과를 생성한다.

  1. 스트림 생성: 데이터 소스로부터 스트림을 생성한다.
  2. 중간 연산: 데이터 변환, 필터링 등의 연산을 여러 개 연결한다.
  3. 종단 연산: 최종적인 결과를 생성하며 스트림을 종료한다.

참고 문헌