【发布时间】:2019-04-29 11:56:15
【问题描述】:
我有一个 Java bean,比如
class EmployeeContract {
Long id;
Date date;
getter/setter
}
如果 a 有一个很长的列表,其中我们有重复的 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(); -
@Eugene 代替
BinaryOperator.maxBy( … .reversed()),您可以使用BinaryOperator.minBy(…)。虽然在这种情况下,看起来 OP 想要maxBy,没有.reversed()。 -
@Holger 并鉴于 this(
values()) 将返回Collection<EmployeeContract>而不是List<EmployeeContract>,有没有一种简洁的方法来解决这个问题? -
鉴于有一个有效的讨论并且这是一个善意的问题,也许值得放弃这个问题?
-
@nullpointer 如果它确实需要是
List,您可以 a) 将整个表达式包装在new ArrayList<>( … )中或 b) 将收集器包装在Collectors.collectingAndThen( …, m -> new ArrayList<>(m.values()))中。
标签: java collections java-8 java-stream reduction