🚀 from error to study/Java

[Java] Object의 key 중복 제거 - DeduplicationUtils

천재강쥐 2023. 9. 22. 14:05

 

 

 

 

 

List로 받아온 값 중 특정 key값을 기준으로 중복 삭제 기능을 할 수 있는 유용한 코드

 

 

 

 

 

[사용법]

1) DeduplicationUtils.java 파일 생성
2) DeduplicationUtils.java 파일에 package 경로 적용
3) 기존 리스트 조회
4) 기존 리스트와 같은 객체를 사용하는 리스트 생성
5) 4의 새로운 리스트에 아래 적용법 사용
List<기존list객채> newList = DeduplicationUtils.deduplication(기존리스트이름, 객체명::get키값);

 

 

 

package 패키지 경로;

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

/** 
 * @param list 중복이 있는 lsit
 * @param key 중복 여부를 판단하는 키값
 * @param<T> generic type
 * @return list
 * @desc list<Object> 특정 값 기준 중복 제거 
 */
public class DeduplicationUtils {
    public static <T> List<T> deduplication(final List<T> list, Function<? super T,?> key){
        return list.stream().filter(deduplication(key))
                .collect(Collectors.toList());
    }
   private static <T> Predicate<T> deduplication(Function<? super T,?> key){
        final Set<Object> set = ConcurrentHashMap.newKeySet();
        return predicate -> set.add(key.apply(predicate));
    }
}

 

// 게시판의 게시물 리스트를 조회한다
List<BrdArticleListItemVO> atclList = articleService.selectArticleList(listVO);

// 앨범형 - 게시물에 2개 이상의 사진이 들어갈 때 사진 수만큼 게시글 나옴
if ("A".equals(listVO.getParam().getListType())) {
    List<BrdArticleListItemVO> deduplicationList = DeduplicationUtils.deduplication(atclList, BrdArticleListItemVO::getAtclId);
    listVO.setAtclList(deduplicationList);
} else {
    listVO.setAtclList(atclList);
}

 

 

 

 

[사용 전]

▶ 사진의 개수만큼 게시물이 나오고 있음

 

 

 

 

[사용 후]

▶ 사진의 개수에 상관없이 게시물은 1개만 노출됨(어떤 게시물이 노출되게 할지는 추가 조건에 따라 달라질 수 있음)