프로그래밍 언어/JAVA

속성 별 Java 8 구별

Rateye 2021. 11. 18. 10:16
728x90
반응형
질문 : 속성 별 Java 8 구별

Java 8에서 각 객체의 속성의 구별 성을 확인하여 Stream API를 사용하여 컬렉션을 필터링하려면 어떻게해야합니까?

예를 들어, Person 개체 목록이 있고 같은 이름을 가진 사람들을 제거하고 싶습니다.

persons.stream().distinct();

Person 객체에 대해 기본 동등성 검사를 사용하므로 다음과 같은 것이 필요합니다.

persons.stream().distinct(p -> p.getName());

불행히도 distinct() 메서드에는 이러한 오버로드가 없습니다. Person 클래스 내에서 동등성 검사를 수정하지 않고 이것을 간결하게 할 수 있습니까?

답변

상태 저장 필터로 distinct 것을 고려하십시오. 다음은 이전에 본 내용에 대한 상태를 유지하고 주어진 요소가 처음으로 표시되었는지 여부를 반환하는 조건자를 반환하는 함수입니다.

public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}

그런 다음 다음과 같이 작성할 수 있습니다.

persons.stream().filter(distinctByKey(Person::getName))

스트림이 정렬되고 병렬로 실행 distinct() 처럼 첫 번째 요소가 아닌 중복 요소 중에서 임의의 요소가 유지됩니다.

(이것은 본질적 으로이 질문에 대한 내 대답과 동일합니다. 임의의 키에 대한 Java Lambda Stream Distinct ()? )

출처 : https://stackoverflow.com/questions/23699371/java-8-distinct-by-property
728x90
반응형