프로그래밍/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
반응형