使用Java Streams从地图列表中提取密钥,并创建地图的地图

时间:2017-03-08 23:21:42

标签: java java-8 java-stream

我正在尝试将项目从Map移到Map之外。

我正在尝试将rowIdentifier从下面的List中取出:

List<Map<Object,Object>>

// [{"rowIdentifier": "s5", "rowKey1": 5, "rowKey2": 7},{"rowIdentifier": "s7", "rowKey1": 9, "rowKey2": 9}]

到结果Map<Map<Object,Object>>

// {"s5": {"rowKey1": 5, "rowKey2": 7}, "s7": {"rowKey1": 9, "rowKey2": 9}

我在理解groupingBycollect(Collectors.mapping)Collectors.toMap时遇到了一些麻烦(我不确定我是否理解'mapping'与'toMap'函数之间的区别在Java Stream中。或者如果我甚至需要它。

DictByRowIdentifier [r [“rowIdentifier”]]是我计划稍后调用它的方式。

网络上的很多示例似乎只是将其收集到ListSet。他们似乎没有把它扔回另一个Map,所以很难找到例子。

1 个答案:

答案 0 :(得分:4)

要回答您的直接问题,您需要toMap()两次:

List<Map<String, String>> listOfMaps = new ArrayList<>(); // populated elsewhere
Map<String, Map<String, String>> mapOfMaps = listOfMaps.stream()
        .collect(Collectors.toMap(m -> m.get("rowIdentifier"), 
            m -> m.entrySet().stream().filter(e -> !e.getKey().equals("rowIdentifier"))
              .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))));

我将类型更改为String,因为它们就是这样,它使所有内容在没有警告的情况下编译。