[Java] 스트림(Stream)

우노구나·2025년 7월 29일

스트림(Stream)이란?

반복문과 조건문을 사용하는 현대적인 방법
컬렉션(Collection)의 데이터를 함수형 스타일로 처리할 수 있도록 도와주는 기능으로 데이터를 하나씩 꺼내면서(흐르듯) 연속적으로 처리하는 도구라고 생각하면 된다.

쓰지 않아도 코딩에 전혀 지장이 없지만 사용하면 코드가 매우 깔끔해져 가독성이 좋아진다.


특징

특징설명
함수형 프로그래밍 지원람다식과 함께 사용하여 코드 간결
중간 + 최종 연산파이프라인 처리 (중간 → 최종)
지연 연산 (Lazy Evaluation)최종 연산이 호출되기 전까지 실행 안 됨
병렬 처리 지원parallelStream()으로 멀티코어 활용
원본 변경 없음원본 컬렉션을 변경하지 않고 새 스트림 반환

스트림 사용 예시

1. 스트림 생성 (source)
2. 중간 연산 (중간 가공: filter, map 등)
3. 최종 연산 (결과 소비: forEach, collect 등)

List<String> list = List.of("kim", "lee", "park");

List<String> result = list.stream()                     // 1. 스트림 생성
    .filter(s -> s.startsWith("k"))                     // 2. 중간 연산
    .map(String::toUpperCase)                           // 2. 중간 연산
    .collect(Collectors.toList());                      // 3. 최종 연산

중간 연산 vs 최종 연산

중간 연산 (Intermediate)

연속적으로 연결 가능한 연산, Stream을 반환

예시설명
filter(Predicate)조건 필터링
map(Function)요소 변환
flatMap(Function)평탄화 (Stream\<Stream> → Stream)
distinct()중복 제거
sorted()정렬
peek(Consumer)중간 결과 확인용
limit(n), skip(n)앞에서 n개만/건너뜀
takeWhile, dropWhile조건 기반 (Java 9+)


최종 연산 (Terminal)

스트림을 소비하고 결과 반환 또는 종료

예시설명
forEach(...)요소 처리
collect(...)수집 (List, Set, Map 등)
toArray()배열로 변환
reduce(...)누적 계산
count()개수 반환
min, max최소/최대
anyMatch, allMatch, noneMatch조건 평가
findFirst, findAny요소 하나 반환


자주 쓰는 수집기 (Collectors)

데이터를 최종적으로 모아서 결과를 만들어내는 도구

수집기설명
toList()List로 수집
toSet()Set으로 수집
toMap()Map으로 수집
joining(",")문자열 합치기
groupingBy(Function)분류
partitioningBy(Predicate)조건에 따라 이분화
counting(), summarizingInt()통계


원시형 스트림(Primitive Stream)

int, long, double과 같은 원시 타입(primitive type) 데이터를 보다 성능 효율적으로 처리하기 위해 제공하는 특수한 스트림 타입

메서드설명
range(1, 10), rangeClosed(1, 10)숫자 범위 스트림
sum(), average()기본 통계
boxed()원시형 → 래퍼형 (int → Integer)
mapToObj()원시형 → 객체 변환
profile
기술 블로그

0개의 댓글