我的地图为:Map<Integer, Map<LocalDate, CustomObject>>
我想对内部地图的每个值执行操作。
我在地图中的数据的示例示例:
<1, Map<2018-12-01, "A">
<2018-12-02, "A">
<2018-12-03, "A">
<2018-12-04, "A">
<2018-12-05, "A">>
<2, Map<2018-12-01, "B">
<2018-12-02, "B">
<2018-12-03, "B">
<2018-12-04, "B">
<2018-12-05, "B">>
<3, Map<2018-12-01, "C">
<2018-12-02, "C">
<2018-12-03, "C">
<2018-12-04, "C">
<2018-12-05, "C">>
我尝试将map的值添加为map的列表;喜欢:
List<Map<LocalDate, CustomObject>>
但是我无法实现我想要执行的操作
我需要的是明智地添加所有元素,并生成结果Map。 即我需要一些类似INTO A RESULTANT MAP
2018-12-01 : A+B+C
2018-12-02 : A+B+C
2018-12-03 : A+B+C
答案 0 :(得分:1)
您可以使用flatMap
获取所有内部Maps的Stream
,然后根据需要收集它们:
Map<Integer, Map<LocalDate, CustomObject>> input = ...
Map<LocalDate,List<CustomObject>> grouped =
input.values() // Collection<Map<LocalDate, CustomObject>>
.stream() // Stream<Map<LocalDate, CustomObject>>
.flatMap(m -> m.entrySet().stream()) // Stream<Map.Entry<LocalDate, CustomObject>>
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,
Collectors.toList())));
答案 1 :(得分:0)
您可以迭代外部和内部地图,并将条目添加到新的多地图中:
Map<LocalDate, List<CustomObject>> result = new LinkedHashMap<>();
yourMap.forEach((k1, v1) ->
v1.forEach((k2, v2) ->
result.computeIfAbsent(k2, k -> new ArrayList<>()).add(v2)));
如果没有键的条目,则使用Map.computeIfAbsent
创建一个新列表。然后将CustomObject
实例添加到列表中。这里k1
是外部映射的键,v1
是内部映射,k2
是LocalDate
,而v2
是CustomObject
实例。 / p>