DEV/Language

[JAVA] 자바 Stream Map, FlatMap의 차이

l-eazzy 2023. 5. 13. 21:14

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

 

728x90