[JAVA] 자바 Stream Map, FlatMap의 차이
Java 코드 작업 중에 객체 내 리스트의 요소 값들만 모아서 리스트를 만드는 경우가 간혹 또는 심심치않게 발생합니다.
그 때마다 검색해서 찾기 귀찮아 간단하게 기록하고자 하는 포스팅입니다.
자바 Stream 에 대해서는 설명하는 글들이 많기에 이번 포스팅에서는 건너뛰도록 하겠습니다.
map() vs flatMap()
이 둘의 차이는
단일 컬렉션을 중간 처리 한 후 스트림으로 만드는 것과
Array, Object 로 감싸져있는 모든 단일 원소로 스트림으로 만드는것에 차이가 있습니다.
코드를 통해 보도록 하겠습니다.
Player.class
class Player {
private String name;
private List<Integer> numbers;
public Player(String name, List<Integer> numbers) {
this.name = name;
this.numbers = numbers;
}
public String getName() {
return name;
}
public List<Integer> getNumbers() {
return numbers;
}
}
먼저 Player라는 클래스를 만들고,
name 과 플레이어가 가지고 있는 numbers 라는 리스트를 변수로 가지고 있습니다.
이제 steam() 메소드를 통해 플레이어가 가지고 있는 넘버에 대한 목록만 가져와 출력해보도록 하겠습니다.
Main.class
public class Main {
public static void main(String[] args) {
// Player 철수
String name1 = "철수";
List<Integer> numbers1 = List.of(1,4,7,9,10);
Player player1 = new Player(name1, numbers1);
// Player 영희
String name2 = "영희";
List<Integer> numbers2 = List.of(2,3,4,6,9);
Player player2 = new Player(name2, numbers2);
// 모든 플레이어 묶음
List<Player> players = List.of(player1,player2);
// map() 메소드를 이용한 처리
List<List<Integer>> eachNumbers = players.stream()
.map(x -> x.getNumbers())
.collect(Collectors.toList());
System.out.println("MAP >>");
System.out.println(eachNumbers);
// flatMap() 메소드를 이용한 처리
List<Integer> allNumber = players.stream()
.flatMap(x -> x.getNumbers().stream())
.collect(Collectors.toList());
System.out.println("FLAT MAP >>");
System.out.println(allNumber);
}
}
Player 철수와 영희라는 두개의 객체를 만들고 List<Player> players 라는 변수에 담고,
그 후 각 플레이어가 가진 숫자만 모아서 출력하게끔 코드를 구성하였고 실행 하면 아래와 같은 출력 결과를 얻습니다.
map() 의 경우
[[1, 4, 7, 9, 10], [2, 3, 4, 6, 9]]
Player 객체 내에 numbers를 리스트로 가져오게 됩니다.
flatMap() 의 경우
[1, 4, 7, 9, 10, 2, 3, 4, 6, 9]
Player 객체 내에 numbers에 포함된 Integer 변수를 한 스트림 안에 묶어 반환하는것을 볼 수 있습니다.
참고 자료
.map()과 .flatMap()의 차이
1. .map() .map()은 단일 스트림의 원소를 매핑시킨 후 매핑시킨 값을 다시 스트림으로 변환하는 중간 연산을 담당합니다. 객체에서 원하는 원소를 추출해는 역할을 한다고 말할 수 있습니다. 아래
kchanguk.tistory.com