【发布时间】:2020-01-30 13:46:04
【问题描述】:
我正在尝试收集列表的结果并将它们组织到一个地图中,其中值是一个地图:
private Map<Organisation, Map<LocalDate, Status>> getSummaries(final List<Status> summaries) {
return summaries
.stream()
.collect(groupingBy(Status::getOrganisation,
toMap(Status::getProcessedDate, Function.identity())));
}
我收到java.lang.IllegalStateException: Duplicate key 错误,因为getProcessedDate() 对于列表中的不同值是相同的。
有没有办法可以将具有相同processeddate 的多个对象合并到地图中?
例如说我在列表中有这些对象:
Summary(ProcesseDate=2020-01-30, Organisation=ABC, status=OK, statusCount=5)
Summary(ProcesseDate=2020-01-30, Organisation=ABC, status=FAILED, statusCount=2)
Summary(ProcesseDate=2020-01-30, Organisation=APPLE, status=OK, statusCount=5)
Summary(ProcesseDate=2020-01-30, Organisation=APPLE, status=REJECTED, statusCount=5)
地图中包含的值应该是:
key=ABC
value { key=2020-01-30, value= Summary(ProcesseDate=2020-01-30, Organisation=ABC, status=OK, statusCount=5), Summary(ProcesseDate=2020-01-30, Organisation=ABC, status=FAILED, statusCount=2) }
当我尝试toMap(Status::getProcessedDate, Function.identity(), (v1, v2) -> v2))); 时,它会删除其中一个条目
【问题讨论】:
-
将map的value类型改为list,在这个阶段合并(v1,v2) -> v1.add(v2);返回 v1;
标签: java java-8 java-stream collectors