著作権:
質問に基づいて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();