
안녕하세요 오늘은 스트림에 대해 알아볼게요!
스트림이란?
스트림(Stream, 흐름)은 자바 8부터 도입된 기능으로,
컬렉션 또는 배열에 저장된 데이터를 선언형(직관, 간결) 방식으로 처리할 수 있게 지원하는 도구예요.
스트림을 사용하면
데이터 필터링, 매핑(변환), 집계 등 다양한 작업을 수행할 수 있고,
람다식과 결합하여 가독성이 높은 코드로 작성이 가능해집니다.
다음 스트림의 3단계 구조를 알아볼까요?
스트림의 3단계 구조 (데이터 파이프라인)
스트임은 데이터를 소스로부터 연속적으로 처리하는 '파이프 라인'을 구축을 하는데
여기서 '파이프 라인'은?
데이터를 사용하는 단계, 절차, 흐름을 뜻해요.
1. 스트림의 생성 - 소스 (Source)
소스는 스트림의 시작점 (생성 단계)로
컬렉션, 배열 또는 파일을 소스로 용으로 활용합니다.
ex) list.stream(), Arrays.steam()
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Stream<String> nameStream = names.stream(); // 스트림 생성
2. 중간 연산
중간 연산은 데이터를 가공하는 단계
필터링, 매핑(변환), 통계 등으로 지연 연산이에요.
스트림의 결과를 반환되기 때문에 메서드 체이닝이 가능해집니다.
+) 지연 연산(처리)은?
즉시 실행되지 않고, 최종 연산이 실행되기 전까지
대기시키는 연산함수의 하나예요.
EX) .filter(x -> x % 2 == 0) // 필터링 (5, 4, 3, 2, 1 ) >> (4, 2)
.map(x -> x * x) // 변환 (4, 2) >> (16, 4)
.sorted() // 정렬 (16, 4) >> (4, 16)
- filter: 조건에 맞는 요소만 추출
- map: 요소를 다른 값으로 변환(매핑)
- sorted: 요소 정렬
- distinct: 중복 제거
- limit(n): 처음부터 n개만 추출
- skip(n): 처음부터 n개를 건너뜀
Stream<String> filtered = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase);
3. 최종 연산
최종 연산은 스트림을 소모하고 결과를 생성해 주는 친구로
모든 데이터를 처리한 후 결과를 반환하거나 출력하는 연산이에요.
최종 연산을 처리한 후로는 스트림에 재사용이 불가능하다는 특징을 가지고 있어요.
EX) collect, forEach, count 등
- forEach: 각 요소에 대해 동작 수행 (반환 X)
- collect:컬렉션으로 반환
- reduce: 모든 요소를 하나의 값으로 줄임
- count: 요소의 개수를 반환
names.stream()
.filter(name -> name.length() > 3)
.map(String::toUpperCase)
.forEach(System.out::println); // 최종 연산: 출력

여기까지 스트림에 대해 알아봤는데요.
기존 자바를 배우고 스트림을 공부하는데 많은 어려움이 있었어요.
조금만 신경을 써주신다면 좋은 성과가 있을 것 같아요.
'Backend > Java' 카테고리의 다른 글
| Spring Boot (1) | 2025.08.17 |
|---|---|
| Java - JDBC (3) | 2025.08.13 |
| 람다식(Lambda Expression) (4) | 2025.07.28 |
| 내부 클래스 (Inner Class) (4) | 2025.07.27 |
| 프레임워크(Framework) (6) | 2025.07.26 |