Stream API란?
자바 8부터 도입된 Stream API는 데이터 처리를 선언형(함수형) 스타일로 쉽게 다룰 수 있게 해주는 기능이다. 배열이나 컬렉션을 반복문 없이 간결하게 처리할 수 있다.
1. 전통적인 for문 방식 vs Stream 방식
for문으로 리스트 요소 출력
List<String> names = Arrays.asList("홍길동", "이몽룡", "성춘향");
for (String name : names) {
System.out.println(name);
}
Java
복사
Stream으로 리스트 요소 출력
names.stream()
.forEach(System.out::println);
Java
복사
2. for문 vs Stream 실전 차이점
비교 항목 | for문 | Stream API |
방식 | 명령형 프로그래밍 | 선언형 프로그래밍 |
코드 길이 | 상대적으로 길다 | 간결하다 |
병렬 처리 | 수동으로 구현 필요 | .parallelStream()로 쉽게 |
가독성 | 복잡한 경우 가독성 떨어짐 | 체이닝으로 가독성 높음 |
부작용 (Side Effect) | 가능성 높음 | 함수형 스타일로 부작용 최소화 |
3. Stream의 핵심 메소드 정리
메소드 | 역할 |
filter() | 조건에 맞는 요소 필터링 |
map() | 요소 변환 |
sorted() | 정렬 |
collect() | 결과 수집 |
forEach() | 반복 실행 |
reduce() | 집계 연산 |
4. 실전 활용 예제
4-1. 조건에 맞는 요소만 필터링 (filter)
List<String> names = Arrays.asList("홍길동", "이몽룡", "성춘향", "변학도");
names.stream()
.filter(name -> name.startsWith("이"))
.forEach(System.out::println);
// 출력: 이몽룡
Java
복사
4-2. 요소 변환 (map)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squared = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println(squared);
// 출력: [1, 4, 9, 16, 25]
Java
복사
4-3. 정렬 (sorted)
List<String> names = Arrays.asList("홍길동", "이몽룡", "성춘향", "변학도");
List<String> sortedNames = names.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedNames);
// 출력: [변학도, 성춘향, 이몽룡, 홍길동]
Java
복사
4-4. 합계 구하기 (reduce)
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b);
System.out.println(sum);
// 출력: 15
Java
복사
5. 병렬 처리: parallelStream()
Stream의 강력한 장점 중 하나는 병렬 처리이다.
names.parallelStream()
.forEach(System.out::println);
Java
복사
6. 실무 팁: 언제 Stream을 쓰면 좋은가?
추천 상황 | 비추천 상황 |
데이터 필터링, 변환, 수집 등 선언형 처리 | 인덱스 기반 반복이 필요할 때 |
병렬 처리가 필요할 때 | 성능이 민감한 로직일 때 |
함수형 스타일을 지향할 때 | 외부 상태 변경이 필요할 때 |
7. 마무리 요약
•
for문보다 Stream API가 코드가 짧고 가독성 좋음
•
Stream은 filter, map, collect, reduce 등의 메소드 체이닝으로 데이터 처리
•
병렬 처리(parallelStream())까지 쉽게 가능
•
실무에서도 DTO 변환, 필터링, 정렬 등에 매우 자주 사용됨