我正在尝试将项目从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}
我在理解groupingBy
和collect(Collectors.mapping)
与Collectors.toMap
时遇到了一些麻烦(我不确定我是否理解'mapping'与'toMap'函数之间的区别在Java Stream
中。或者如果我甚至需要它。
DictByRowIdentifier [r [“rowIdentifier”]]是我计划稍后调用它的方式。
网络上的很多示例似乎只是将其收集到List
或Set
。他们似乎没有把它扔回另一个Map
,所以很难找到例子。
答案 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
,因为它们就是这样,它使所有内容在没有警告的情况下编译。