반응형

 

 

 

 

📌 자바 맵을 리스트로 변환하는 방법

Map to list conversion in java 8

 

맵(Map)을 리스트(List)로 변환하는 방법을 소개하기 전에 맵과 리스트의 특징은 아래와 같다.

 

 

◾ 맵(Map)

   ▫ 키(Key)와 값(Value)의 쌍을 이루는 컬렉션이다.

   ▫ 키(Key)는 고유한 값이기 때문에 중복될 수 없다.

   ▫ 맵은 삽입 순서를 보장하지 않는다.(= 순서가 의미를 가지지 않는다.)

Map<String, Integer> map = new HashMap<>();
map.put("John", 34);
map.put("Jane", 26);
map.put("Tom", 27);
map.put("Bill", 29);

System.out.println("Print Map: " + map);
// Print Map: {Tom=27, John=34, Bill=29, Jane=26}

 

 

◾ 리스트(List)

   ▫ 데이터가 순차적으로 저장되며 고유한 인덱스가 존재한다.

List<String> li = new ArrayList<String>(
        Arrays.asList("John", "Jane", "Tom", "Bill"));
        
System.out.println("Print List: " + li);
System.out.println("Print Second Item: " + li.get(1));
// Print List: [John, Jane, Tom, Bill]
// Print Second Item: Jane

 

 

 

 

1️⃣ Map.Entry<K, V> 타입의 리스트로 변환

Java 8 버전에서 스트림(Stream)이 도입되었고 스트림을 통해 복잡한 코드를 간단하게 작성할 수 있다.

stream() 메서드를 사용하면 키(Key)-값(Value) 형태를 유지할 수 있지만 반환 값을 컬렉션으로 변환하는 작업이 필요하다. 

public static void main(String[] args) {
  Map<String, Integer> map = new HashMap<>();
  map.put("John", 34);
  map.put("Jane", 26);
  map.put("Tom", 27);
  map.put("Bill", 29);

  List<Map.Entry<String, Integer>> li = map.entrySet()
          .stream()
          .collect(Collectors.toList());

  System.out.println("List: " + li);
}
// List: [Tom=27, John=34, Bill=29, Jane=26]

 

 

 

2️⃣ 두 개의 List를 사용

두 개의 리스트를 사용하여 하나의 리스트는 키(Key) 값을 갖도록, 나머지 하나는 값(Value)을 가질 수 있다.

키의 목록을 반환하는 keySet() 메서드와 값의 목록을 반환하는 values() 메서드를 ArrayList 생성자에 전달한다.

public static void main(String[] args) {
  Map<String, Integer> map = new HashMap<>();
  map.put("John", 34);
  map.put("Jane", 26);
  map.put("Tom", 27);
  map.put("Bill", 29);

  List<String> keyList = new ArrayList(map.keySet());
  List<Integer> valueList = new ArrayList(map.values());

  System.out.println("Key List: " + keyList);
  System.out.println("Value List: " + valueList);
}
// Key List: [Tom, John, Bill, Jane]
// Value List: [27, 34, 29, 26]

 

 

 

3️⃣ Collectors.toList() 및 Stream.map() 메서드

이 방식은 데이터를 컬렉션으로 변환하기 전에 반환 값에 대해 전처리 작업을 할 수 있다는 장점을 가지고 있다.

public static void main(String[] args) {
  Map<String, Integer> map = new HashMap<>();
  map.put("John", 34);
  map.put("Jane", 26);
  map.put("Tom", 27);
  map.put("Bill", 29);

  List<String> keyList = map.keySet()
          .stream()
          .collect(Collectors.toList());
          
  List<Integer> valueList = map.values()
          .stream()
          .collect(Collectors.toList());

  System.out.println("Key List: " + keyList);
  System.out.println("Value List: " + valueList);
}
// Key List: [Tom, John, Bill, Jane]
// Value List: [27, 34, 29, 26]

 

예를 들어 아래와 같이 키(Key)를 소문자로 변환하고 값(Value)을 변경할 수 있다.

public static void main(String[] args) {
  Map<String, Integer> map = new HashMap<>();
  map.put("John", 34);
  map.put("Jane", 26);
  map.put("Tom", 27);
  map.put("Bill", 29);

  List<String> keyList = map.keySet()
          .stream()
          .map(String::toLowerCase) // 메서드 참조
          .collect(Collectors.toList());

  List<Integer> valueList = map.values()
          .stream()
          .map(i -> i * 10)
          .collect(Collectors.toList());

  System.out.println("Key List: " + keyList);
  System.out.println("Value List: " + valueList);
}

// Key List: [tom, john, bill, jane]
// Value List: [270, 340, 290, 260]

 

 

 

4️⃣ Stream.filter() 및 Stream.sorted() 메서드

stream()의 결과를 반환하기 전에 filter() 및 sorted() 메서드를 통해 반환 값을 필터링하거나 정렬할 수 있다.

public static void main(String[] args) {
  Map<String, Integer> map = new HashMap<>();
  map.put("John", 34);
  map.put("Jane", 26);
  map.put("Tom", 27);
  map.put("Bill", 29);

  List<String> keyList = map.keySet()
          .stream()
          .sorted() // 정렬
          .collect(Collectors.toList());

  List<Integer> valueList = map.values()
          .stream()
          .filter(i -> i >= 30) // 30이상인 데이터만 추출
          .collect(Collectors.toList());

  System.out.println("Key List: " + keyList);
  System.out.println("Value List: " + valueList);
}
// Key List: [Bill, Jane, John, Tom]
//Value List: [34]

 

 

 

 

 

 

 

📘 참고사이트

https://developer-talk.tistory.com/394

 

 

 

 

 

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기