Java/Basic

[Java-Basic] List<Obj> 특정값 기준 중복제거 방법

Jeong Jeon
반응형

자주 필요해서 정리해 놓으려고 한다!

 

우선 제네릭과 람다를 잘 몰라서.. 공부를 해야겠다...ㅠ

 

 

상황 : Object list에서 Grouping 할 수 있는 컬럼을 기준으로 중복을 제거하려고 한다.

 

보통 이런상황에서는 for문을 여러번 돌려서 사용했다.

하지만 매번 for문을 돌리거나 특정 컬럼을 기준으로 쿼리를 뽑아와서 사용하기에는, 같은 상황이 몇번 발생한다..

그래서 다같이 편할 수 있도록 Util을 만들어놓고 사용하고자 하여 조사를 해보았다.

 

 

해결 : 

 

1). pom .xml

=> 기존 aspectj Version을 1.6.x 대를 사용했다.

하지만 하위 에러 발생.

Error Code : error : org.aspectj.apache.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 18

원인은 aspectj Version이 낮아서 였다. 그래서 1.8대로 Version up.

 

2). Util

public class ArrayListUtils {

	/**
     * @param list 중복이 있는 list
     * @param key  중복 여부를 판단하는 키값
     * @param <T>  generic type
     * @return list
     * @desc list<Object> 특정 값 기준 중복 제거
     */
    public static <T> List<T> deduplication(final ArrayList<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));
    }
}

 

3). 사용처

ArrayListUtils.deduplication(List , Vo입력 ::중복 제거할 key의 get메소드);

 

자주 쓸일이 있을테니..! 확인!

제대로 이해하기 위해 제네릭과 람다를 공부해야겠다...

 

오늘도 화이팅!

반응형