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));
'IT' 카테고리의 다른 글
Java Stream Grouping - 데이터 그룹화와 집계 (0) | 2024.01.15 |
---|---|
[java8] stream을 이용하여 list 합치는 방법 (0) | 2021.02.20 |
공공기관 문서 발급 시 발급 가능한 프린터가 없을 때? (feat. 모두의 프린터 사용법 리뷰) (1) | 2021.02.04 |
[JAVA] 자바 ... 파라미터 = 가변인자 ( varargs ) (1) | 2021.02.02 |
티스토리 구글 애드센스 신청 방법 & "사이트 검토 중" 해결 방법 (0) | 2021.01.30 |