Java 转换地图<;字符串,列表<;MyObject>;列出<;地图<;字符串,MyObject>&燃气轮机;在爪哇
我想将Java 转换地图<;字符串,列表<;MyObject>;列出<;地图<;字符串,MyObject>&燃气轮机;在爪哇,java,data-structures,Java,Data Structures,我想将映射转换为列表 {,} 将转换为 [{,},{,}] 其中,myObject1和myObject3具有相同的唯一id,myObject2和myObject4也具有相同的唯一id 我的实现如下所示,但是否有一种更为优化的实现方法 private List<Map<String, MyObject>> getObjectMapList( Map<String, List<MyObject>> objectMap) { List<Map
映射转换为列表
{,}
将转换为
[{,},{,}]
其中,myObject1和myObject3具有相同的唯一id,myObject2和myObject4也具有相同的唯一id
我的实现如下所示,但是否有一种更为优化的实现方法
private List<Map<String, MyObject>> getObjectMapList( Map<String, List<MyObject>> objectMap)
{
List<Map<String, MyObject>> objectMapList = new ArrayList<Map<String,MyObject>>();
for(MyObject myObject : objectMap.get("key1")) {// there will be default key1 whose value is known
Map<String, MyObject> newMap= new HashMap<String, MyObject>();
for (String key : objectMap.keySet()) {
newMap.put(key, objectMap.get(key).stream()
.filter(thisObject -> thisObject.getId().equals(myObject.getId()))
.collect(Collectors.toList()).get(0));
}
objectMapList.add(newMap);
}
return objectMapList;
}
私有列表getObjectMapList(Map objectMap)
{
List objectMapList=新建ArrayList();
对于(MyObject MyObject:objectMap.get(“key1”){//将有默认的key1,其值是已知的
Map newMap=newhashmap();
for(字符串键:objectMap.keySet()){
newMap.put(key,objectMap.get(key.stream)()
.filter(thisObject->thisObject.getId().equals(myObject.getId()))
.collect(Collectors.toList()).get(0));
}
objectMapList.add(newMap);
}
返回objectMapList;
}
此流应返回所需的结果。在旧的Eclipse版本中,我在类型方面遇到了一些问题。您可能需要将其分解为单个步骤,或者在lambdas中添加一些类型,但我希望保持简短
Map<String, List<MyObject>> objectMap = new HashMap<>();
objectMap.keySet()
.stream()
.flatMap(key -> objectMap.get(key)
.stream()
.map(obj -> new AbstractMap.SimpleEntry<>(key, obj)))
.collect(groupingBy(pair -> pair.getValue().getId()))
.values()
.stream()
.map(listOfSameIds -> listOfSameIds.stream()
.collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue)))
.collect(toList());
Map objectMap=newhashmap();
objectMap.keySet()
.stream()
.flatMap(键->objectMap.get(键)
.stream()
.map(obj->newAbstractMap.SimpleEntry(key,obj)))
.collect(分组依据(对->对.getValue().getId())
.values()
.stream()
.map(listOfSameIds->listOfSameIds.stream()
.collect(toMap(SimpleEntry::getKey,SimpleEntry::getValue)))
.collect(toList());
我所做的是:
flatMap(key->streamOfKeyObjectPairs)
)collect(groupingBy)
)map(list->toMap)
)这是一个没有任何花括号的1-liner:
private List<Map<String, MyObject>> getObjectMapList( Map<String, List<MyObject>> objectMap) {
return map.entrySet().stream()
.map(e -> e.getValue().stream()
.map(o -> Collections.singletonMap(e.getKey(), o))
.collect(Collections.toList())
.flatMap(List::stream)
.collect(Collections.toList());
}
私有列表getObjectMapList(Map objectMap){
返回map.entrySet().stream()
.map(e->e.getValue().stream())
.map(o->Collections.singletonMap(e.getKey(),o))
.collect(Collections.toList())
.flatMap(列表::流)
.collect(Collections.toList());
}
这里的主要“技巧”是使用允许无块在线创建和填充地图
免责声明:代码可能无法编译或工作,因为它是在我的手机上被翻阅的(但有一个合理的机会它会工作)看起来不错,我会记住
singletonMap
。但这是否仍然按MyObject.getId()对这些对进行分组
?或者结果列表中的每个映射是否仅包含一个映射?@MalteHartwig仅包含一个映射语言变量从何而来?是一些输入错误。编辑的itI无法使其工作。groupingBy(pair->pair.getValue().getId())如果拆分为不同的操作,则抱怨未知对象事件是否添加了groupingBy方法的导入?写入收集器。groupingBy
以检查导入是否丢失。否则,您可以尝试通过替换pair->pair.getValue().getId()
by来显式键入pair
参数(SimpleEntry pair)->pair.getValue().getId()
。如果仍然不起作用,可以尝试将lambda分配给函数变量:函数toID=pair->pair.getValue().getId()
。