给定具有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));
Run Code Online (Sandbox Code Playgroud)
我想输出:
[Employee{id=1, name='Bob', iq=120}, Employee{id=2, name='Alice', iq=100}]
Run Code Online (Sandbox Code Playgroud)
因此,基于员工的id属性从列表中删除重复项,并出于明显的原因选择智商最高的员工。:)
特别是,我对调整此解决方案感兴趣,该解决方案仅根据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));
Run Code Online (Sandbox Code Playgroud)
有办法吗?
这个怎么样,
Collection<Employee> distinctEmps = employee.stream()
.collect(Collectors.toMap(Employee::getId, Function.identity(),
(e1, e2) -> e1.getIq() >= e2.getIq() ? e1 : e2))
.values();
Run Code Online (Sandbox Code Playgroud)
仅遵循@Holgers方法的另一个变体是,
Collection<Employee> distinctEmps = employee.stream()
.collect(Collectors.toMap(Employee::getId, Function.identity(),
BinaryOperator.maxBy(Comparator.comparing(Employee::getIq))))
.values();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
133 次 |
| 最近记录: |