将Map <string,list <myobject =“”>转换为List <map <string,myobject =“”>&gt;在java中

时间:2017-03-04 19:47:51

标签: java data-structures

我想转换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;

}

2 个答案:

答案 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());

我的工作是:

  1. 将所有输入值中的所有对象与其键对齐,并将它们放在一个长列表中(flatMap(key -> streamOfKeyObjectPairs))。
  2. 将这些对分开对象的ID(collect(groupingBy))。
  3. 获取每个组并将对列表转换为地图(map(list -> toMap)
  4. 将所有这些地图放入列表