Develop/JAVA

[JAVA] dto model 특정값 중복 제거 합치기 stream filter distinct sort

issuemaker99 2024. 9. 10. 15:35
728x90

JAVA List model 데이터에서 특정 컬럼을 기준으로 중복되는 데이터를 합치고 싶을 때 사용

// 장바구니 상품 목록 조회 
ScrtPrdInfrDto scrtPrdInVo = new ScrtPrdInfrDto();
scrtPrdInVo.setAnpMbrNo(mbrDto.getAnpMbrNo());
scrtPrdInVo.setAnpPrslTpCd("01");
List<ScrtPrdInfrDto> scrtPrdList = scrtService.getScrtPrdInfrList(scrtPrdInVo);

 

List<ScrtPrdInfrDto> scrtPrdList 값에서 getAnpDispMdclCd, getAnpDispMdclCdNm 두 개 컬럼을 기준으로 중복데이터를 합칩니다. 

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class ScrtController {
    public ModelAndView getScrtList(HttpServletRequest request) {
    	
        // 장바구니 상품 목록 조회 
        ScrtPrdInfrDto scrtPrdInVo = new ScrtPrdInfrDto();
        scrtPrdInVo.setAnpMbrNo(mbrDto.getAnpMbrNo());
        scrtPrdInVo.setAnpPrslTpCd("01");
        List<ScrtPrdInfrDto> scrtPrdList = scrtService.getScrtPrdInfrList(scrtPrdInVo);

        // 카테고리 distinct 
        List<ScrtPrdInfrDto> scrtCateList = scrtPrdList.stream()
            .filter(distinctByKey(p -> p.getAnpDispMdclCd() + " " + p.getAnpDispMdclCdNm()))
            .distinct()
            .collect(Collectors.toList());
    }

    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) 
    {
        Map<Object, Boolean> map = new ConcurrentHashMap<>();
        return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
}

 

List<ScrtPrdInfrDto> scrtPrdList 값은 6개지만 List<ScrtPrdInfrDto> scrtCateList 값은 3개 입니다. 

 

그리고 distinct 를 하면 list 의 순서가 바뀝니다. 그래서 다시 sort 를 해줘야 합니다.

.sorted((p1, p2) -> p1.getAnpDispMdclCd().compareTo(p2.getAnpDispMdclCd())) 는 getAnpDispMdclCd 값으로 asc 정렬을 합니다.

// 카테고리 distinct 
List<ScrtPrdInfrDto> scrtCateList = scrtPrdList.stream()
    .filter(distinctByKey(p -> p.getAnpDispMdclCd() + " " + p.getAnpDispMdclCdNm()))
    .distinct()
    .sorted((p1, p2) -> p1.getAnpDispMdclCd().compareTo(p2.getAnpDispMdclCd()))
    .collect(Collectors.toList());
mav.addObject("scrtCateList", scrtCateList);
LIST