커스텀한 객체를 가지는 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
|
출처