在地图列表中分离每个地图

时间:2018-12-20 06:47:18

标签: java collections

我的地图为: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

2 个答案:

答案 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是内部映射,k2LocalDate,而v2CustomObject实例。 / p>