📚 2장. 스트림(Stream) 기본
💡 스트림이란?
스트림(Stream)은 데이터의 흐름을 추상화한 개념입니다.
컬렉션(리스트, 배열 등) 데이터를 선언형으로 처리할 수 있게 도와줍니다.
스트림 특징
- 원본 데이터를 변경하지 않는다
- 필터링, 매핑, 정렬 등 다양한 연산 가능
- 중간 연산과 최종 연산으로 구성된다
📝 예제: 스트림 기본 사용
코드
List<String> fruits = Arrays.asList("apple", "banana", "cherry"); fruits.stream() .filter(fruit -> fruit.startsWith("b")) .forEach(System.out::println);
실행 결과
banana
코드 분석
코드 라인 | 설명 |
---|---|
fruits.stream() | 리스트를 스트림으로 변환 |
filter(fruit -> fruit.startsWith("b")) | 'b'로 시작하는 과일만 필터링 |
forEach(System.out::println) | 필터링된 과일을 하나씩 출력 |
🛠️ .stream() 다음에 바로 사용할 수 있는 주요 메서드
메서드 | 설명 | 유형 |
---|---|---|
filter() | 조건에 맞는 데이터만 남긴다 | 중간 연산 |
map() | 데이터를 변환한다 | 중간 연산 |
sorted() | 데이터를 정렬한다 | 중간 연산 |
distinct() | 중복을 제거한다 | 중간 연산 |
limit() | 일부 데이터만 가져온다 | 중간 연산 |
skip() | 일부 데이터를 건너뛴다 | 중간 연산 |
forEach() | 각 데이터에 대해 작업을 수행한다 | 최종 연산 |
collect() | 결과를 수집한다 | 최종 연산 |
count() | 요소 수를 센다 | 최종 연산 |
🚀 스트림 전체 흐름 정리
stream() ➔ 데이터를 스트림으로 만들고 중간 연산 (filter, map, sorted, distinct, limit, skip) ➔ 데이터를 변형하거나 가공하고 최종 연산 (forEach, collect, count) ➔ 데이터를 사용하거나 모은다
💡 추가로 기억할 점
- 모든 중간 연산은 지연(Lazy) ➔ 최종 연산을 만나야 실행된다!
🔎 .forEach()는 어디에 적용될까?
✅ .forEach()는 스트림의 결과(남아있는 요소들)에 적용된다.
- .filter()를 통과한 데이터들 ➔
- .forEach()가 하나씩 가져다가 작업한다!
🔎 .filter()가 리스트 전체를 다 돈 다음 .forEach()를 실행하는 걸까?
정확히는 아니다.
- 스트림은 "하나씩(hungry model)", "지연(lazy)" 하게 처리된다.
- 최종 연산 (forEach)을 만나야 진짜 실행된다.
실제 흐름:
- stream() ➔ 준비만 함
- filter() ➔ 조건 저장
- forEach() ➔ 실행되면서 요소를 하나씩 처리
🎯 초간단 요약
부분 | 설명 |
---|---|
fruit | 네가 직접 정한 변수명 (스트림 요소 하나) |
filter(fruit -> fruit.startsWith("b")) | 요소 하나하나 검사해서 true인 것만 통과 |
forEach(System.out::println) | 통과한 요소 하나하나를 출력 |
전체 흐름 | 하나 꺼내 ➔ 필터 ➔ 출력 ➔ 반복 |
📦 코드 흐름 다시 정리
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "blueberry"); fruits.stream() .filter(fruit -> fruit.startsWith("b")) .forEach(System.out::println);
🧠 심화 개념: 스트림 특징
특성 | 설명 |
---|---|
지연 실행 (Lazy) | 중간 연산은 최종 연산이 있어야 실행된다. |
요소 단위 처리 | 하나씩 꺼내서 처리 후 다음 요소 진행 |
메모리 절약 | 리스트 전체를 저장하지 않고 흐름에 따라 처리 |
✅ 결론
- .stream() ➔ 준비만 한다
- .filter() ➔ 조건 저장
- .forEach() ➔ 하나씩 꺼내 필터하고 출력!
0 댓글