자바 8 특성과 조건에 따라 중복 제거

권리 :

질문에 따라 https://stackoverflow.com/a/29671501/2517622

ID, 이름과 IQ와 직원의 목록을 감안할 때 :

List<Employee> employee = Arrays.asList(new Employee(1, "John", 80), new Employee(1, "Bob", 120), Employee(1, "Roy", 60), new Employee(2, "Alice", 100));

나는 출력합니다 :

[Employee{id=1, name='Bob', iq=120}, Employee{id=2, name='Alice', iq=100}]

그래서, 직원의 ID 속성에 따라 목록에서 중복을 제거하고 분명한 이유 가장 높은 IQ를 가진 직원을 선택합니다. :)

특히, 난 단지 ID를 기반으로 중복을 제거하는이 솔루션을 조정에 관심이 :

    import static java.util.Comparator.comparingInt;
    import static java.util.stream.Collectors.collectingAndThen;
    import static java.util.stream.Collectors.toCollection;

    ...
    List<Employee> unique = employee.stream()
                                    .collect(collectingAndThen(toCollection(() -> new TreeSet<>(comparingInt(Employee::getId))),
                                                               ArrayList::new));

방법이 있나요?

라빈 드라 Ranwala :

이건 어때,

Collection<Employee> distinctEmps = employee.stream()
    .collect(Collectors.toMap(Employee::getId, Function.identity(), 
        (e1, e2) -> e1.getIq() >= e2.getIq() ? e1 : e2))
    .values();

단지 다음 @Holgers 접근 방식에 의해 또 다른 변형 될 것이다

Collection<Employee> distinctEmps = employee.stream()
    .collect(Collectors.toMap(Employee::getId, Function.identity(), 
        BinaryOperator.maxBy(Comparator.comparing(Employee::getIq))))
    .values();

추천

출처http://43.154.161.224:23101/article/api/json?id=172595&siteId=1