✅ 1. Stream이란?
Java 8에서 도입된 Stream API는 데이터를 함수형 스타일로 선언적으로 처리할 수 있도록 도와주는 기능입니다.
- 데이터의 흐름(Stream)을 추상화한 객체
- 컬렉션(List, Set 등)의 요소를 간결하게 처리 가능
- 내부 반복을 사용하여 가독성과 효율성 향상
- 데이터를 변경하지 않고 처리하는 비파괴적 처리 방식
✅ 2. Stream 처리 단계
Stream은 다음과 같은 3단계로 구성되어 처리됩니다:
- 스트림 생성
- 중간 연산 (filter, map 등)
- 최종 연산 (collect, forEach 등)
List<String> list = Arrays.asList("a", "b", "c");
List<String> result = list.stream()
.filter(s -> !"b".equals(s))
.map(String::toUpperCase)
.collect(Collectors.toList());
✅ 3. 스트림 생성 방법
방법예시 코드
컬렉션 | list.stream() |
배열 | Arrays.stream(arr) |
직접 값 지정 | Stream.of(1, 2, 3) |
무한 스트림 | Stream.generate(Math::random) |
✅ 4. 주요 연산 메서드
🔹 중간 연산 (Intermediate)
메서드 | 설명 |
filter(Predicate) | 조건에 맞는 요소만 필터링 |
map(Function) | 요소를 다른 형태로 변환 |
sorted() | 정렬 |
distinct() | 중복 제거 |
limit(n) / skip(n) | 앞 n개 선택 / 앞 n개 건너뜀 |
🔹 최종 연산 (Terminal)
메서드 | 설명 |
collect() | 결과를 수집 (List, Set 등으로 반환) |
forEach() | 요소 반복 처리 |
count() | 요소 개수 반환 |
anyMatch() / allMatch() | 조건 일치 여부 판단 |
reduce() | 누적값 계산 (예: 합계) |
✅ 5. 실전 예제
List<String> names = Arrays.asList("홍길동", "김철수", "이영희");
List<String> result = names.stream()
.filter(name -> name.startsWith("김"))
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // [김철수]
✅ 6. 병렬 스트림 (Parallel Stream)
list.parallelStream().forEach(System.out::println);
- 멀티코어 CPU 환경에서 병렬 처리 가능
- 주의사항: 순서 보장 X, 공유 자원 접근 시 동기화 필요
✅ 7. Stream API의 장단점
✅ 장점
- 코드가 간결하고 가독성이 높음
- 함수형 프로그래밍 방식으로 유연한 데이터 처리
- 병렬 처리에 유리
⚠️ 단점
- 디버깅이 어려움 (중간 상태 확인이 번거로움)
- 스트림은 1회성이라 재사용 불가
- 무한 스트림 사용 시 종료 조건 주의 필요
✅ 8. 실무 팁
- filter + map + collect는 가장 자주 쓰이는 기본 패턴입니다.
- 성능이 중요한 경우 parallelStream() 활용을 고려해보세요.
- peek() 메서드는 디버깅 시 중간 상태를 확인하는 데 유용합니다.
이 글은 Java 8 Stream API의 기본 개념을 이해하고 실무에 활용할 수 있도록 구성된 입문 가이드입니다. 이후에 collect(), reduce(), groupingBy() 등 고급 주제도 함께 학습하시면 Stream을 더욱 효과적으로 활용할 수 있어요 ✨