[이것이 자바다] 16. 스트림 요소 처리
안녕하세요. 이번에는 자바 8에 도입되어 컬렉션 처리에 혁명을 가져온 스트림에 대해 정리한 내용입니다. 저도 사실 이부분을 정확하게 이해를 못했어서 이렇게 정리하고 자바를 쓰고 여러번 보면서 이해할겁니다.
1. 스트림(Stream)이란?
- 컬렉션(List, Set 등)의 저장 요소들을 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자입니다.
- 선언형 프로그래밍: "어떻게(How)"가 아니라 "무엇을(What)" 할 것인지에 집중합니다. (for문, if문 로직을 짤 필요가 사라짐)
특징
- 내부 반복자:
for문처럼 외부에서 요소를 꺼내는 게 아니라, 처리 방법(람다식)만 전달하면 컬렉션 내부에서 알아서 반복 처리합니다. (병렬 처리에 유리) - 파이프라이닝: 여러 단계의 연산(필터링 -> 매핑 -> 집계)을 물 흐르듯이 연결할 수 있습니다.
- 지연 연산 (Lazy): 최종 결과가 필요할 때까지 연산을 미룹니다.
2. 스트림의 3단계
스트림 처리는 생성 -> 중간 연산 -> 최종 연산의 3단계를 거칩니다.
1단계: 생성 (Source)
- 컬렉션:
list.stream()/list.parallelStream()(병렬) - 배열:
Arrays.stream(arr) - 숫자 범위:
IntStream.range(1, 10)
2단계: 중간 연산 (Intermediate Operations)
데이터를 가공하는 단계입니다. 여러 번 연결할 수 있으며, 실제 처리는 하지 않고 파이프라인만 구성합니다.
- 필터링
filter(조건): 조건에 맞는 요소만 남깁니다.distinct(): 중복을 제거합니다.
- 매핑
map(변환함수): 요소를 다른 형태로 변환합니다. (예: 학생 객체 -> 점수 정수)flatMap(): 여러 개의 스트림을 하나로 합칠 때 사용합니다.
- 정렬
sorted(): 기본 정렬 (Comparable 필요)sorted(Comparator): 정렬 기준 지정
- 루핑(중간 확인)
peek(): 중간에 결과 확인용 (디버깅)
3단계: 최종 연산 (Terminal Operations)
실제 결과를 만들어내는 단계입니다. 이 메소드가 호출되어야 비로소 모든 처리가 실행됩니다.
- 매칭
allMatch(),anyMatch(),noneMatch(): 조건을 만족하는지 확인 (true/false)
- 집계
count(),sum(),average(),max(),min()reduce(): 사용자 정의 집계
- 루핑
forEach(): 요소를 하나씩 꺼내 소비 (주로 출력용)
- 수집 (가장 중요)
collect(): 처리된 결과를 다시List,Set,Map등으로 변환합니다.
// 예시: 점수가 80점 이상인 학생들의 이름을 리스트로 수집
List<String> honorRoll = studentList.stream() // 1. 생성
.filter(s -> s.getScore() >= 80) // 2. 중간 연산 (필터링)
.map(Student::getName) // 2. 중간 연산 (이름으로 매핑)
.collect(Collectors.toList()); // 3. 최종 연산 (리스트로 수집)
3. 병렬 처리 (Parallel Stream)
parallelStream()을 사용하면 포크-조인(Fork-Join) 프레임워크를 통해 대용량 데이터를 여러 코어에서 병렬로 처리합니다.- 개발자가 직접 스레드를 관리할 필요 없이 메소드 호출 하나로 병렬 처리가 가능합니다.
핵심 포인트
- 스트림은 데이터의 흐름입니다. 원본 데이터를 변경하지 않습니다.
- 람다식을 적극적으로 활용하여 코드가 매우 간결해집니다.
- 중간 연산은 꼬리에 꼬리를 물 수 있고, 최종 연산은 딱 한 번만 호출되어 결과를 만듭니다.
- 복잡한
for,if로직을filter,map,collect등의 선언적 코드로 대체할 수 있습니다.
감사합니다.
'Language > JAVA' 카테고리의 다른 글
| [이것이 자바다].ch18.네트워크 입출력 (0) | 2026.01.02 |
|---|---|
| [이것이 자바다].ch17.데이터 입출력 (0) | 2026.01.02 |
| [이것이 자바다].ch15.람다식 (0) | 2026.01.01 |
| [이것이 자바다].ch14.컬렉션 (0) | 2025.12.30 |
| [이것이 자바다].ch13.스레드 (0) | 2025.12.30 |