💡 핵심 요약 (TL;DR)
List에서 중복값을 제외하는 방법2가지의 동작 원리를 이해하고 실제 프로젝트에 적용하기 위한 실무 가이드다.
커스텀한 객체를 가지는 List에서 중복된 객체를 제거하고 싶었다. 차장님께 물어보니 2가지 방법을 알려주셨다.
커스텀한 객체를 가지는 List에서 중복된 객체를 제거하고 싶었다. 차장님께 물어보니 2가지 방법을 알려주셨다.
기존코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| @Data class User { String name; int age; @Override public String toString() { return name + ":" + age; } }
List<User> userList = new ArrayList<>(); userList.add(new User("조지", 7)); userList.add(new User("휘슬", 8)); userList.add(new User("브라이언", 9)); userList.add(new User("브라이언", 9));
userList.forEach(System.out::println);
조지:7 휘슬:8 브라이언:9 브라이언:9
|
위 userList에서 중복을 제거하는 방법은 2가지이다.
생성자를 활용하거나 stream().distinct()를 사용하는 방법이다.
1 생성자 활용
기본 타입이 아닌 참조 타입인 경우 클래스에서 hashCode() 메서드와 equals() 메서드를 재정의 먼저 해줘야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| @Data class User { String name; int age; @Override public String toString() { return name + ":" + age; } @Override public int hashCode(){ return Objects.hash(name, age); } @Override public boolean equals(Object obj){ if(this == obj) return true; if(obj == null) return false; if(getClass() != obj.getClass()){ retyrn false; } User other = (User) obj; return name == other.name && Objects.equals(age, other.age); } }
List<User> distinctUserList = new ArrayList<User>(new HashSet<User>(userList)); distinctUserList.forEach(System.out::println);
조지:7 휘슬:8 브라이언:9
|
2 stream 활용
기본 타입이 아닌 참조 타입인 경우 클래스에서 hashCode() 메서드와 equals() 메서드를 재정의 먼저 해줘야한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| @Data class User { String name; int age; @Override public String toString() { return name + ":" + age; } @Override public int hashCode(){ return Objects.hash(name, age); } @Override public boolean equals(Object obj){ if(this == obj) return true; if(obj == null) return false; if(getClass() != obj.getClass()){ retyrn false; } User other = (User) obj; return name == other.name && Objects.equals(age, other.age); } }
List<User> distinctUserList = userList.stream() .distinct() .collect(Collectors.toList());
distinctUserList.forEach(System.out::println);
조지:7 휘슬:8 브라이언:9
|
출처