IT

java8 stream list to map & 중복 제거

채보 2021. 3. 11. 00:21

java8 stream을 이용해서 list -> map으로 변환 및 중복 제거하는 방법에 대해 정리해보도록 하겠습니다. 

 

 

 stream을 이용하여 list to map

 

* 샘플로 Goods class 생성

// lombok을 이용
@Getter
@Setter
public class Goods {

	private String no;
    
    	private String name;
}

 

기존에는 반복문을 이용해서 map으로 변환하였습니다.


// goodsList에 값을 넣는 부분은 생략
List<Goods> goodsList = new ArrayList<>;

// 리턴할 map 선언
Map<String, String> goodsMap = new HashMap<>();

// 반복문을 이용해서 map에 데이터를 put
for (Goods goods : goodsList) {
	goodsMap.put(goods.getNo(), goods.getName());
}

 

java8에서는 stream을 이용해서 좀 더 쉽게 만들 수 있습니다. 

// goodsList에 값을 넣는 부분은 생략
List<Goods> goodsList = new ArrayList<>;

// stream을 이용하여 map으로 변환
Map<String, String> goodsMap = 

	goodsList.stream()
    		 .collect(Collectors.toMap(Goods::getNo, Goods::getName));

 

소스도 간단해지고 코딩이 매우 간결해지게 됩니다. 

 

 

 중복제거

 

아시겠지만 반복문을 이용하여 map에 put 하는 경우는 key가 중복될 경우 마지막에 put한 값으로 덮어쓰게 됩니다. 

Map<String, String> map = new HashMap<>();
map.put("a", "kim-a");
map.put("b", "kim-b");
map.put("a", "kim-d");
map.put("c", "kim-c");

// 결과 : 처음에 put한 kim-a는 사라지는 것을 확인할 수 있다.
map: [a:kim-d, b:kim-b, c:kim-c]

 

하지만 stream을 이용하여 map으로 변환하는 경우에는 key가 중복될 경우 "java.lang.IllegalStateException: Duplicate key ..."이 발생하게 됩니다.

 

exception을 발생시키지 않으려면 추가적으로 처리를 해줘야 합니다. 

 

key가 중복될 경우 기준이 되는 값을 설정한다.

// stream을 이용하여 map으로 변환
// key가 중복될 때 기존 key(p1)와 신규 key(p2) 중에 남겨놓을 key를 선택한다.
Map<String, String> goodsMap = 

	goodsList.stream()
    		 .collect(Collectors.toMap(Goods::getNo, Goods::getName), (p1, p2) -> p1));