Удалить дубликаты на основе свойства и предиката в Java 8 - PullRequest
6 голосов
/ 28 марта 2019

Вопрос основан на https://stackoverflow.com/a/29671501/2517622

Приведен список сотрудников с идентификатором, именем и 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 по очевидным причинам. :)

В частности, я заинтересован в настройке этого решения, которое удаляет дубликаты только на основе идентификатора:

    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));

Есть ли способ?

1 Ответ

8 голосов
/ 28 марта 2019

Как насчет этого,

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...