我想把一个Map列表转换成一个Map列表。它保证所有的Map都有相同的键。
例如,以下列表
[{key1: val1, key2: val2}, {key1: val3, key2: val4}]
转换为
{key1: [val1, val3], key2: [val2, val4]}
下面的代码使用for循环来实现
List<Map<String, Object>> data = getData();
Map<String, List<Object>> result = new HashMap<>();
for (Map<String, Object> element: data) {
element.forEach((key, val) -> {
if (result.containsKey(key))
result.get(key).add(val);
else
result.put(key, Arrays.asList(val));
});
}
我怎样才能使用流实现相同的结果呢?
4条答案
按热度按时间to94eoyn1#
例如,像这样,依赖于java流的收集阶段。
在SO上有许多这样的应用程序(例如this one),尽管不是针对这个例子精确定制的。
r55awzrz2#
您可以在没有流的情况下以现代方式执行此操作,如下所示:
这将迭代列表,然后迭代每个Map,并使用
Map.computeIfAbsent
来容纳result
Map中的条目。rxztt3cl3#
这个依赖于
stream.reduce
的版本应该做到这一点:**说明:**此代码遍历列表中的每个map,并将其累积到hashmap中(reduce函数的第一个参数),累积函数(第二个参数)如果第一次看到键,则将新列表添加到hashmap中(否则将累积到已经存在的列表中);第三个函数是串行或并行运行流函数之间的一致性所必需的(它在并行运行中组合部分结果)。
m1m5dgzv4#
你可以使用
Collectors.toMap
方法:标签:Convert a map of lists into a list of maps