본문 바로가기

JAVA

[JAVA] StreamAPI를 이용 한 List 값 중복 제거

 

 

 

가장 기초적인 방법은 반복문을 통해 중복을 제거하는 방법이 있다.

Java 8 이상인 경우 Stream API 를 사용할 수 있다.

 

stream.distinct() 를 이용해 간단하게 중복 된 데이터를 제거 해보자.

 

 

public class Main {
  public static void main(String args[]) {
    List<String> list = new ArrayList<String>();
    list.add("ABCD");
    list.add("ABCD");
    list.add("A");
    list.add("ABC");
    list.add("AC");
    list.add("AB");
    list.add("AB");

    list = new ArrayList<String>(
            list.stream().distinct().collect(Collectors.toList()));
  }
}

 

중복 값 제거 전: [ABCD, ABCD, A, ABC, AC, AB, AB]
중복 값 제거 후: [ABCD, A, ABC, AC, AB]

 

 

.distinct() 메소드는 Object의 equals로 비교하므로 객체 자체가 같은지를 비교한다.

 

리터럴 형태의 String을 인자로 갖는 List 등은 비교 가능하지만, Dto 형태의 Model(Entity) 는 비교가 안 된다.

 

 

Dto 형태의 List 객체를 제거하고 싶을 때는 특정 Key 값을 기준으로 filter 처리를 해서 넘기면 된다.

 

 

public class ListDupleUtils{
	
   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 <?> Predicate<T>(Function<? super T,?>key){
   	 final Set<Object>set = ConcurrentHashMap.newKeySet();
     return predicate -> set.add(key.apply(predicate));
   }

 

 

위의 메서드는 중복이 존재하는 List , 기준이 될 Key 값을 인자로 받아 중복 제거 후 return 한다.

 

ConcurrentHashMap 은 Key,value에 null 을 허용하지 않는다.

 

 

ListDupleUtils.deduplication(list, Vo값(entity) :: 중복 제거 할 Key 값 get 메서드);