가장 기초적인 방법은 반복문을 통해 중복을 제거하는 방법이 있다.
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 메서드);
'JAVA' 카테고리의 다른 글
[JAVA] 다른 프로젝트 클래스 import 하기 + Dynamic Web Module 추가하는 방법 (0) | 2023.11.16 |
---|---|
[JAVA] OkHttp 사용법 + IllegalStateException 에러 원인/해결 방법 (0) | 2023.07.10 |
[JAVA] object List to map using stream - Object List를 Map 으로 변환하기 (0) | 2023.06.20 |
[JAVA] List를 comma(,)로 구분된 String(문자열)으로 변환하기 (0) | 2023.06.20 |
[JAVA] Java Stream - 두 개의 List 객체 비교하기 (0) | 2023.06.15 |