Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java Streams将映射列表转换为列表映射_Java_List_Dictionary_Java Stream - Fatal编程技术网

使用Java Streams将映射列表转换为列表映射

使用Java Streams将映射列表转换为列表映射,java,list,dictionary,java-stream,Java,List,Dictionary,Java Stream,我想将地图列表转换为列表地图。可以保证所有地图都具有相同的密钥 例如,下面的列表 [{key1:val1,key2:val2},{key1:val3,key2:val4}] 转换为 {key1:[val1,val3],key2:[val2,val4]} 下面的代码使用for循环来实现 List data=getData(); 映射结果=新的HashMap(); 用于(地图元素:数据){ 元素。forEach((键,val)->{ if(结果容器(键)) 结果.get(key).add(val

我想将地图列表转换为列表地图。可以保证所有地图都具有相同的密钥

例如,下面的列表

[{key1:val1,key2:val2},{key1:val3,key2:val4}]
转换为

{key1:[val1,val3],key2:[val2,val4]}
下面的代码使用for循环来实现

List data=getData();
映射结果=新的HashMap();
用于(地图元素:数据){
元素。forEach((键,val)->{
if(结果容器(键))
结果.get(key).add(val);
其他的
put(key,Arrays.asList(val));
});
}
如何使用streams实现相同的结果?

此版本依赖于以下内容:

//一些测试值
列表=新的ArrayList();
列表.增补("1,"1,","2","2"地图);;
列表.增补("3,"3,"4,"4,"5","5"地图);;
添加列表(地图编号(“3”、“青少年”、“5”、“五”));
添加列表(图3、图3、图4、图4、图4);
//流还原转换
映射结果=list.stream().reduce(新的HashMap(),
(行政协调会,地图)->{
地图forEach((k,v)->acc.ComputeFabSent(k,
l->newarraylist()).add(v));
返回acc;
},
(acc1,acc2)->{
acc1.putAll(acc2);
返回acc1;
});
//输出
系统输出打印项次(结果);
//{1=[1],2=[2],3=[3,青少年,三岁],4=[4,四岁],5=[5,五岁]}

解释:此代码遍历列表中的每个映射,并将其累加到hashmap中(reduce函数的第一个参数),如果累加函数(第二个参数)第一次看到一个键,则向hashmap添加一个新列表(否则它将累加到已经存在的列表中);第三个函数是串行或并行运行流函数的一致性所必需的(它在并行运行中结合了部分结果)。

例如,依赖于java流的收集阶段

List data=new ArrayList();
HashMap transposed=data.stream()
.flatMap(i->i.entrySet().stream())
.collect(收集器.groupingBy(
Map.Entry::getKey,
HashMap::新建,
Collectors.mapping(Map.Entry::getValue,
collection(ArrayList::new));

SO上有许多这样的应用程序(例如),尽管没有精确地针对本例进行定制。

您可以在没有流的情况下使用,但可以采用现代方式,如下所示:

Map<String, List<Object>> result = new HashMap<>();
data.forEach(element -> 
    element.forEach((k, v) - > 
        result.computeIfAbsent(k, x -> new ArrayList<>()).add(v)));
Map result=newhashmap();
data.forEach(元素->
元素forEach((k,v)->
computeIfAbsent(k,x->newArrayList()).add(v));
这将对列表进行迭代,然后对每个映射进行迭代,并用于容纳
结果
映射中的条目。

您可以使用以下方法:

List listofmap=List.of(
地图(“键1”、“val1”、“键2”、“val2”),
地图(“键1”、“键3”、“键2”、“键4”);
Map MapOfList=listOfMaps.stream()
//溪流
.flatMap(map->map.entrySet().stream())
//溪流
.collect(collector.toMap)(
//钥匙
Map.Entry::getKey,
//价值观
e->List.of(e.getValue()),
//合并函数
(列表1、列表2)->{
列表=新的ArrayList();
list.addAll(列表1);
list.addAll(列表2);
退货清单;
},//地图工厂
LinkedHashMap::new));
System.out.println(列表地图);
//[{key1=val1,key2=val2},{key1=val3,key2=val4}]
System.out.println(MapofList);
//{key1=[val1,val3],key2=[val2,val4]}

另见: