Backend/JAVA&JAVA8

[JAVA8] Map to List, List to Map-1 / Map을 리스트로, 리스트를 맵으로-1

GreatSaiyaman 2022. 5. 5. 14:03

사진 설명을 입력하세요.

오늘은 어떠한 이론적인 내용보다는 평소에 실무에서 많이 사용하는 List를 Map으로, Map을 List로 변환하는 과정에 대해서 간단하게 알아보려고 합니다.

보통 서버 개발을 Spring으로 하시는 분들은 쿼리에 대한결과를 mybatis로 받아서 Java에서 이런저런 처리를 해서 Client요청에 대한 응답값을 Client에 내려주게됩니다.

그렇다면 Client에서 Server에서 내려준 결과를 받아서 화면에 뿌려주게 되구요. 대부분의 환경이, 그렇게 뿌려주는 곳이 웹 혹은 앱이라고 생각합니다.

 

백문이 불여 일타라고 하죠?

우선 강아지 클래스를 하나 만들어 보겠습니다.

    static class Puppy {
        private int id;
        private String name;

        Puppy(int id, String name) {
            this.id = id;
            this.name = name;
        }


        public int getId() {
            return id;
        }


        public String getName() {
            return name;
        }


        public void setId(int id) {
            this.id = id;
        }


        public void setName(String name) {
            this.name = name;
        }
    }
 

그리고 강아지들을 담는 list를 하나 만들어줍니다.

    static List<Puppy> getPuppyList() {
        List<Puppy> list = new ArrayList<>();
        list.add(new Puppy(1, "풍산개"));
        list.add(new Puppy(2, "진돗개"));
        list.add(new Puppy(3, "똥개"));
        
        return list;
    }
 

풍산개와 진돗개, 똥개를 list에

이곳에서 보면, 풍산개같은 경우 id가 1, 이름이 언급한 풍산개입니다.

이곳에서 id와 이름이 두가지만 Map으로 변환시켜 보겠습니다.

어떠한 예를 들기에 굉장히 애매하지만 분명히 List를 Map으로 변환해야하는 니즈가 있습니다.

 

1.list to map

    static void listToMap() {
        List<Puppy> list = getPuppyList();

        Map<Integer, String> resultMap = list.stream()
                                             .collect(
                                                     Collectors.toMap(
                                                             Puppy::getId,
                                                             Puppy::getName
                                                     )
                                             );
        System.out.println(resultMap);
    }
 

결과는 아래와 같습니다.

resultMap:{1=풍산개, 2=진돗개, 3=똥개}
 

 

 

2. list to map without duplicated key

list를 map으로 변환하는 과정에서 중복된 id 값(map에서는 key값이라고 하죠)을 제거 하고 싶으신 적이 있으실 겁니다.

그런경우에는 Collectors.toMap()의 세번째 파라미터에 람다를 선언해주시면 됩니다.

(oldValue, newValue) -> newValue

이런식으로 선언하면, 중복값을 제거해줍니다.

아래 코드로 더 자세히 알아보시겠습니다.

    static void listToMapRemovingDuplicatedKey() {

        List<Puppy> list = getPuppyList();

        list.add(new Puppy(3, "똥개"));


        Map<Integer, String> result = list
                        .stream()
                        .collect( // oldValue, newValue 에 따라 먼저 선언한값, 나중에 선언한값 골라서 도출해내면 된다.
                                // 세번째 파라미터는 mergeFunction을 선언하면 반환시킬 수 있다.
                                Collectors.toMap(
                                        Puppy::getId,
                                        Puppy::getName,
                                        (oldValue, newValue) -> newValue
                                )
                        );


        System.out.println("Duplicated key: " + result);
    }
 

출력 결과는 아래와 같습니다.

Duplicated key: {1=풍산개, 2=진돗개, 3=똥개}
 

메소드 내부에 중복 key와 value인 풍산개 객체를 add하였지만 출력은 중복된 객체가 제외된 체로 깔끔하게 출력된 것을 보실 수 있습니다.

 

key값이 int인 경우 비교하여 역순으로 정렬하는 방법도 있습니다.

 

3. list sort

    private static void listSortAndCollect() {

        List<Puppy> list = getPuppyList();


        Map result = list
                .stream()
                .sorted(
                        Comparator
                                .comparingInt(Puppy::getId)
                                .reversed()
                )
                .collect(
                        Collectors.toMap(
                                Puppy::getId,
                                Puppy::getName,
                                (oldValue, newValue) -> oldValue,
                                LinkedHashMap::new
                        )
                );
        
        System.out.println("listSortAndCollect result: " + result);
    }
 

출력 결과는 아래와 같습니다.

listSortAndCollect result: {3=똥개, 2=진돗개, 1=풍산개}
 

 

map을 list로 변경하는 코드에 대해서는 다음 시간에 알아보도록 할게요.

 

감사합니다!