📌 자바 맵을 리스트로 변환하는 방법
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
'Backend > Java (Spring)' 카테고리의 다른 글
[Java] DecimalFormat을 이용한 숫자 형식 변경 (0) | 2022.11.07 |
---|---|
[Java] 숫자 왼쪽에 0으로 값 채우기 (0) | 2022.11.04 |
[Java] 자바 옵셔널(Java Optional)이란? (0) | 2022.07.18 |
[MyBatis] 마이바티스 동적 쿼리 작성하기 (0) | 2022.06.15 |
[JAVA] 예외처리 방법과 종류 [Checked , Unchecked Exception] (0) | 2022.04.27 |
최근댓글