🇶 Stream API의 map과 flatMap의 차이점을 설명하고, 각각의 활용 사례를 예시 코드와 함께 설명해주세요.
Stream API
: java 8 부터 추가된 기능, 컬렉션에 저장된 엘리먼트들을 하나씩 순회하면서 처리한다.
스트림 파이프라인
1단계) 생성 : 소스 → 생성
- 데이터의 원천 (예: Collection, 배열, I/O 채널 등)
2단계) 중간 연산(Intermediate Operations) : 가공(매핑, 필터링..)
- 스트림을 변환하거나 연산함.
- 각 연산은 새로운 스트림을 반환하며, 여러 연산을 메서드 체인 형태로 연결 가능.
- 주의‼️ 스트림의 중간 연산은 최종 연산이 호출되기 전까지 실제로(런타임) 실행되지 않음
3단계) 최종 연산(Terminal Operations) : 결과
- 스트림 파이프라인을 종료하고 결과를 반환
- 최종 연산이 호출되어야 중간 연산들이 실제로 실행됨!!
Map() vs FlatMap()
Map()은 각각의 요소를 다른 obj로 변환한다. 함수를 인자로 받아서 함수안에 있는 변환 로직을 받아 실행한다.
List<String> titles = Arrays.asList("java basics", "programming principles", "data structures");
List<String> capitalizedTitles = titles.stream()
.map(title -> title.substring(0, 1).toUpperCase() + title.substring(1))
.toList();
System.out.println(capitalizedTitles);
// Output: [Java basics, Programming principles, Data structures]
FlatMap()은 2차원 리스트를 1차원으로 변환하는데 사용된다.
ex) 문자열 리스트에서 단어만 추출하기
List<String> sentences = Arrays.asList("I love Java", "Stream API is powerful");
List<String> words = sentences.stream()
.flatMap(sentence -> Arrays.stream(sentence.split(" ")))
.collect(Collectors.toList());
System.out.println(words);
// 출력: [I, love, Java, Stream, API, is, powerful]
Reference
https://medium.com/@reetesh043/java-stream-map-vs-flatmap-60a10e666c75