I have a Java bean, like
class EmployeeContract {
Long id;
Date date;
getter/setter
}
如果我有一个很长的列表,其中我们按id重复但日期不同,例如:
1, 2015/07/07
1, 2018/07/08
2, 2015/07/08
2, 2018/07/09
我该如何缩减列表,只保留最近日期的条目,例如:
1, 2018/07/08
2, 2018/07/09
最好使用Java 8...
我开始尝试了以下代码:
contract.stream()
.collect(Collectors.groupingBy(EmployeeContract::getId, Collectors.mapping(EmployeeContract::getId, Collectors.toList())))
.entrySet().stream().findFirst();
这让我得到了各个组内的映射,但是我不知道如何将其收集到结果列表中 - 我的流技能并不太强,恐怕无法解决...
yourList.stream() .collect(Collectors.toMap( EmployeeContract::getId, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(EmployeeContract::getDate).reversed())) ) .values();
- EugeneBinaryOperator.maxBy(…….reversed())
,你可以使用BinaryOperator.minBy(…)
。不过在这种情况下,看起来提问者想要使用maxBy
而不需要.reversed()
。 - Holgervalues()
)会返回一个Collection<EmployeeContract>
而不是一个确切的List<EmployeeContract>
,是否有一种简洁的解决方法? - NamanList
,你可以a) 将整个表达式包装在new ArrayList<>(…)
中,或者b) 将收集器包装在Collectors.collectingAndThen(…, m -> new ArrayList<>(m.values()))
中。 - HolgerLocalDate
表示仅包含日期而不包含时间和时区的值。永远不要使用Date
(一个糟糕的类,现在已经过时)。 - Basil Bourque