List에서 중복 제거를 하려면 기본적으로 Collections에는 stream API 사용시 distinct 라는 중복 제거 메서드가 있습니다.
따라서 리터럴 형태의 String을 인자로 갖는 List 등은 비교가 가능하지만 , Dto 형태의 모델은 비교가 안되며 Object 자체도 같은 주소값을 가지는 경우는 가능하지만 안의 속성을 비교하고자 할때는 비교가 어렵습니다. 이런 경우 사용할 수 있는 Utils 클래스 입니다.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentInfo{
private Long studentNo;
private String name;
private int age;
}
StudentInfo s1 = new StudentInfo(1L,"codeA",22);
StudentInfo s2 = new StudentInfo(2L,"codeB",25);
StudentInfo s3 = new StudentInfo(3L,"codeC",29);
StudentInfo s4 = new StudentInfo(4L,"codeD",21);
StudentInfo s5 = new StudentInfo(5L,"codeJ",27);
StudentInfo s6 = new StudentInfo(6L,"codeJ",28);
List<StudentInfo> list = List.of(s1,s2,s3,s4,s5,s6);
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 <?> Predicate<T>(Function<? super T,?>key){
final Set<Object>set = ConcurrentHashMap.newKeySet();
return predicate -> set.add(key.apply(predicate));
}
<? super T>
public class DeDuplicationUtilTest {
public static void main(String[] args) {
StudentInfo s1 = new StudentInfo(1L, "codeA", 22);
StudentInfo s2 = new StudentInfo(2L, "codeB", 25);
StudentInfo s3 = new StudentInfo(3L, "codeC", 29);
StudentInfo s4 = new StudentInfo(4L, "codeD", 21);
StudentInfo s5 = new StudentInfo(5L, "codeJ", 27);
StudentInfo s6 = new StudentInfo(6L, "codeJ", 28);
List<StudentInfo> list = List.of(s1, s2, s3, s4, s5, s6);
//이름이 같은 사람은 제거
List<StudentInfo> deduplicationList = DeduplicationUtils.deduplication(list, StudentInfo::getName);
deduplicationList.forEach(lists -> System.out.println(lists.toString()));
}
}