我想转换Map<String, List<MyObject>> to List<Map<String, MyObject>>
{<key1,[myObject1, myObject2]>, <key2,[myObject3, myObject4]>}
will be converted to
[{<key1,myObject1>, <key2,myObject3>}, {<key1,myObject2>, <key2, myObject4>}]
其中myObject1和myObject3具有相同的唯一ID,myObject2和myObject4也是如此。
我的实现如下,但有更好的方法。
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;
}
答案 0 :(得分:1)
这是一个没有任何花括号的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());
}
这里的主要“技巧”是使用Collections.singletonMap()
来允许无块的在线创建和填充地图。
免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有可能起作用)
答案 1 :(得分:0)
此流应返回所需的结果。使用我的旧Eclipse版本,我在类型方面遇到了一些麻烦。您可能需要将其分解为单个步骤,或者在lambda中添加一些类型,但我想保持简短。
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());
我的工作是:
flatMap(key -> streamOfKeyObjectPairs)
)。collect(groupingBy)
)。map(list -> toMap)
)