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
반응형
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Java로 새 List를 만드는 방법 (0) | 2021.11.22 |
---|---|
wget을 통해 Linux에서 Java JDK를 다운로드하면 대신 라이센스 페이지가 표시됩니다. (0) | 2021.11.19 |
JavaScript에서 방향키를 감지 하는 방법 (0) | 2021.11.16 |
Java에서 List을 Array로 변환하는 방법 (0) | 2021.11.16 |
Java에서 두 배열을 연결하는 방법 (0) | 2021.11.16 |