프로그래밍/java
[ java ] Stream의 distinct 활용하기 ( hashcode와 equals 활용 )
Yanoo
2022. 4. 12. 00:02
728x90
반응형
- User
@AllArgsConstructor
@Builder
@Getter
public class User {
private String address;
private String name;
}
가 있다고 했을 때,
@Test
public void distinct_test() {
User user1 = new User("서울", "kim");
User user2 = new User("부산", "oh");
User user3 = new User("서울", "yu");
User user4 = new User("서울", "choi");
User user5 = new User(null, "kang");
ArrayList<User> users = Lists.newArrayList(user1, user2, user3, user4, user5);
List<User> collects = users.stream().distinct().collect(Collectors.toList());
for (User collect : collects) {
System.out.println("collect. = " + collect.getName());
}
}
가 있을 때, 결과는 어떻게 출력될까?
distict를 썼지만, 구분되는 것 없이 모두 출력될 것이다.
여기서 나는 주소가 같다면 같은 것으로 만들고 싶다. 그렇다면
User에서 hashcode와 equals를 오버라이딩 해서 밑에처럼 만들어주면된다.
@AllArgsConstructor
@Builder
@Getter
public class User {
private String address;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if (user.getAddress().equals(((User) o).getAddress())) {
return true;
}
return Objects.equals(getAddress(), user.getAddress());
}
@Override
public int hashCode() {
return Objects.hash(getAddress());
}
}
출력해보면,
이런식을 equals와 hashcode를 커스텀 하여 자유롭게 사용하면 된다.
728x90
반응형