Java 8부터 추가된 기능으로, 컬렉션에 저장된 데이터를 하나씩 순회하면서 처리할 수 있는 기능으로 for, for-each 형태보다 더 가독성이 좋게 다룰 수 있게 해주며, 데이터를 원하는 형식으로 변환하거나 조작하는데 효율적입니다.
map()은 각 요소를 특정 규칙에 따라 변환할 때 사용하는 연산자입니다.
public class MapExample {
public static void main(String[] args) {
List<String> words = Arrays.asList("Apple", "Banana", "Airplane", "Coke", "Door", "Ant");
List<Integer> wordLength = words.stream()
.map(String::length)
//.map(word -> word.length()) 와 같음
.collect(Collectors.toList());
System.out.println(wordLength); // 결과: [5, 6, 8, 4, 4, 3]
}
}
flatMap()은 중첩된 스트림 구조를 펼쳐 하나의 스트림으로 만드는 연산입니다.
public class FlatMapExample {
public static void main(String[] args) {
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("JAVA", "BACKEND", "STREAM", "SPRING"),
Arrays.asList("java", "backend", "stream", "spring")
);
System.out.println("list = " + nestedList); // 결과: list = [[JAVA, BACKEND, STREAM, SPRING], [java, backend, stream, spring]]
List<String> flatList = nestedList.stream() // Stream<List<String>>으로 변환
.flatMap(Collection::stream) // Stream<String>으로 변환
.collect(Collectors.toList());
System.out.println("flatList = " + flatList); // 결과: flatList = [JAVA, BACKEND, STREAM, SPRING, java, backend, stream, spring]
}
}
map()과 flatMap() 모두 Stream API에서 데이터 흐름을 가공하고 변환하기 위한 중간 연산(Intermediate Operation)이지만 map()은 각 요소를 다른 요소로 1:1 매핑하여 결과가 중첩된 구조일지라도 그 구조를 유지하는 반면 flatMap()은 각 요소를 컬렉션, Optional, 스트림과 같은 다수의 값으로 변환한 후 이를 단일 스트림이나 Optional로 평탄화(flatten)하여 중첩을 제거한다는 차이점이 있습니다.