[Java] Stream 중복 제거 (feat.@EqualsAndHashCode 어노테이션)

해니·2025년 4월 18일
0

Java

목록 보기
29/34
post-thumbnail

중복 제거 실패..! 💣


List<Mall> mallList =  new ArrayList<>();
List<GetLoansLimitMallResponseDto.MallDataProviderInfo> mallDataProviderList = Stream.concat(
                responseGetSettlementScheduledForAllMalls.stream()
                        .map(item -> MallDataProviderInfo.builder()
                                .mallSeq(item.getMallSeq())
                                .mallName(item.getMallName())
                                .mallAccountId(item.getMallAccountId())
                                .dataProviderSeq(item.getDataProviderSeq())
                                .dataProviderName(item.getDataProviderName())
                                .build()),
                responseGetAllMallsSalesInfo.stream()
                        .map(item -> MallDataProviderInfo.builder()
                                .mallSeq(item.getMallSeq())
                                .mallName(item.getMallName())
                                .mallAccountId(item.getMallAccountId())
                                .dataProviderSeq(item.getDataProviderSeq())
                                .dataProviderName(item.getDataProviderName())
                                .build())
        )
        .distinct()
        .collect(Collectors.toList());

Stream.distinct() 메서드를 이용하면 중복된 값을 제거해준다고 하는데 , mallSeq, mallName, mallAccountId가 중복된 데이터들이 리스트에 보여져서 해결 방안 찾기 시작했다... 🖥️




Stream.distinct() 메서드

  • 고유 요소로 이루어진 스트림을 반환하는 Stream의중간 연산
  • 고유 여부는 객체의 equals()hashCode() 메서드를 통해 판단한다.
  • 사용자가 정의한 클래스를 이용한 객체 리스트에서 중복을 제거하는 경우, distinct()를 사용할 equals()hashCode()를 오버라이드하여 재정의해야 한다.



equals() 메소드

  • 두 참조 변수의 값이 같은지 다른지 동등 여부를 비교해야 할 때 사용한다.
    ex) String 타입의 변수를 비교

// 출처: https://inpa.tistory.com/entry/JAVA-☕-equals-hashCode-메서드-개념-활용-파헤치기 [Inpa Dev 👨‍💻:티스토리]

String s1 = "Hello";
String s2 = "Hello";

System.out.println(s1 == s2); // 주소 비교 false
System.out.println(s1.equals(s2)); // 값 비교 true


Person person1 = new Person("홍길동");
Person person2 = new Person("홍길동");

System.out.println(person1 == person2); // == 은 객체타입인경우 주소값을 비교한다. 서로다른 객체는 다른 주소를 가지고 있기 때문에 false가 출력됨
System.out.println(person1.equals(person2)) // equals또한 객체타입인경우 주소값을 비교하기 때문에 false가 출력된다.



hashCode() 메소드

  • 객체의 주소 값을 이용해서 해싱(hashing) 기법을 통해 해시 코드를 만든 후 반환한다.
  • 서로 다른 두 객체는 같은 해시 코드를 가질 수 없다.

✨📗엄밀히 말하면 해시코드는 주소값은 아니고, 주소값으로 만든 고유한 숫자값이다..


// 출처: https://inpa.tistory.com/entry/JAVA-☕-equals-hashCode-메서드-개념-활용-파헤치기 [Inpa Dev 👨‍💻:티스토리]

Person p1 = new Person("홍길동");
Person p2 = new Person("홍길동");

// 객체 인스턴스마다 각기 다른 주해시코드(주소))를 가지고 있다.
System.out.println(p1.hashCode()); // 622488023
System.out.println(p2.hashCode()); // 1933863327




@EqualsAndHashCode 어노테이션

  • equals, hashCode 자동 생성해주는 어노테이션
  • 두 객체가 같은지 비교하거나 해시값을 계산할 때 사용된다.


@Getter
@Builder
@EqualsAndHashCode(of = "mallSeq") // 중복 기준
public class MallInfo {
    private Long mallSeq;
    private String mallName;
    private String mallAccountId;
}


List<GetLoansLimitMallResponseDto.MallInfo> mallList = Stream.concat(
        responseGetSettlementScheduledForAllMalls.stream()
                .map(item -> GetLoansLimitMallResponseDto.MallInfo.builder()
                        .mallSeq(item.getMallSeq())
                        .mallName(item.getMallName())
                        .mallAccountId(item.getMallAccountId())
                        .build()),

        responseGetAllMallsSalesInfo.stream()
                .map(item -> GetLoansLimitMallResponseDto.MallInfo.builder()
                        .mallSeq(item.getMallSeq())
                        .mallName(item.getMallName())
                        .mallAccountId(item.getMallAccountId())
                        .build())
)
.distinct() // equals/hashCode 기준으로만 동작함
.collect(Collectors.toList());




출처

Lombok @Data의 @EqualsAndHashCode이 뭐하는 애일까?
[Stream API] 중간 연산 - distinct 메서드
[Java] - Stream API ③ distinct()로 중복 요소 제거하기
☕ 자바 equals / hashCode 오버라이딩 - 완벽 이해하기

profile
💻 ⚾️ 🐻

0개의 댓글