Java 8 Stream 函数分组到 Map 其中 value 是一个 Map
Java 8 Stream function grouping to Map where value is a Map
我正在尝试收集列表的结果并将它们组织到一个 Map 中,其中值是一个 Map:
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.merge()
。
map.merge(key, value, bifunction);
检查地图中是否存在 key
。如果不是,则调用 map.put(key, value);
如果是,则将 bifunction
应用于现有键和值,并将其存储在映射中。
例如,如果您有一个 Map<String, Integer>
来计算文章中某个单词的出现次数,您可以使用以下内容:
List<String> words = ...
Map<String, Integer> wordCount = ...
words.forEach(s -> wordCount.merge(s, 1, (word, count) -> count + 1));
您可以使用它来避免在代码中添加重复键。
如果您不想合并数据并且没有唯一键,您可能只是在寻找嵌套分组:
private Map<Organisation, Map<LocalDate, List<Status>>> getSummaries(final List<Status> summaries) {
return summaries
.stream()
.collect(groupingBy(Status::getOrganisation, groupingBy(Status::getProcessedDate)));
}
我正在尝试收集列表的结果并将它们组织到一个 Map 中,其中值是一个 Map:
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.merge()
。
map.merge(key, value, bifunction);
检查地图中是否存在 key
。如果不是,则调用 map.put(key, value);
如果是,则将 bifunction
应用于现有键和值,并将其存储在映射中。
例如,如果您有一个 Map<String, Integer>
来计算文章中某个单词的出现次数,您可以使用以下内容:
List<String> words = ...
Map<String, Integer> wordCount = ...
words.forEach(s -> wordCount.merge(s, 1, (word, count) -> count + 1));
您可以使用它来避免在代码中添加重复键。
如果您不想合并数据并且没有唯一键,您可能只是在寻找嵌套分组:
private Map<Organisation, Map<LocalDate, List<Status>>> getSummaries(final List<Status> summaries) {
return summaries
.stream()
.collect(groupingBy(Status::getOrganisation, groupingBy(Status::getProcessedDate)));
}