使用Java Streams从地图列表中提取键,并创建一个地图的地图

4

我正在尝试将一个在Map内部的项目移动到Map外部。

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

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}

我有一点困难理解在Java StreamgroupingBycollect(Collectors.mapping)Collectors.toMap 的区别(我不确定"mapping"和"toMap"函数之间的区别,或者我是否需要它们)。

DictByRowIdentifier[r["rowIdentifier"]] 是我计划稍后调用该方法的方式。

网上很多示例似乎只是将其收集到ListSet中。它们似乎没有将其放回到另一个Map中,因此很难找到示例。

1个回答

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,因为它们本来就是字符串类型,并且这样可以使所有内容都能够编译而不会出现警告。


太不可思议了!我完全想不出来。我不理解collect()的文档,也不知道toMap和mapping有什么区别。我没有想到用filter来从下游删除相同的键。这解释了很多问题。谢谢! - Dexter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接