语义上等同于尤金的回答 https://stackoverflow.com/a/45080555/2711488,但更简单一些:
List<Foo> foos = Stream.of(new Foo("a", "b", 1), new Foo("a", "b", 2),
new Foo("a", "b", 3), new Foo("a", "bb", 3), new Foo("aa", "b", 3))
.collect(Collectors.collectingAndThen(
Collectors.toMap(x -> Arrays.asList(x.getA(), x.getB()), x -> x,
BinaryOperator.minBy(Comparator.comparing(Foo::getC))),
map -> new ArrayList<>(map.values())));
您需要按包含这两个属性的键进行分组,并且由于缺乏标准Pair
类型,您可以使用List
有两个元素或一个Map.Entry
,两者都有效。但使用List
更简单(在 Java 9 中,您可以使用List.of(…, …)
这甚至更简单)并且如果两个属性中可能出现相同的值,则具有更好的哈希码。
当下游操作是纯归约时,例如选择C
财产,toMap
收集器更适合,因为它不需要处理Optional
.