반복문과 조건문을 사용하는 현대적인 방법
컬렉션(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. 최종 연산
연속적으로 연결 가능한 연산, Stream을 반환
| 예시 | 설명 |
|---|---|
| filter(Predicate) | 조건 필터링 |
| map(Function) | 요소 변환 |
| flatMap(Function) | 평탄화 (Stream\<Stream> → Stream) |
distinct() | 중복 제거 |
sorted() | 정렬 |
peek(Consumer) | 중간 결과 확인용 |
limit(n), skip(n) | 앞에서 n개만/건너뜀 |
takeWhile, dropWhile | 조건 기반 (Java 9+) |
스트림을 소비하고 결과 반환 또는 종료
| 예시 | 설명 |
|---|---|
forEach(...) | 요소 처리 |
collect(...) | 수집 (List, Set, Map 등) |
toArray() | 배열로 변환 |
reduce(...) | 누적 계산 |
count() | 개수 반환 |
min, max | 최소/최대 |
anyMatch, allMatch, noneMatch | 조건 평가 |
findFirst, findAny | 요소 하나 반환 |
데이터를 최종적으로 모아서 결과를 만들어내는 도구
| 수집기 | 설명 |
|---|---|
toList() | List로 수집 |
toSet() | Set으로 수집 |
toMap() | Map으로 수집 |
joining(",") | 문자열 합치기 |
groupingBy(Function) | 분류 |
partitioningBy(Predicate) | 조건에 따라 이분화 |
counting(), summarizingInt() | 통계 |
int, long, double과 같은 원시 타입(primitive type) 데이터를 보다 성능 효율적으로 처리하기 위해 제공하는 특수한 스트림 타입
| 메서드 | 설명 |
|---|---|
range(1, 10), rangeClosed(1, 10) | 숫자 범위 스트림 |
sum(), average() | 기본 통계 |
boxed() | 원시형 → 래퍼형 (int → Integer) |
mapToObj() | 원시형 → 객체 변환 |