Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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 转换地图<;字符串,列表<;MyObject>;列出<;地图<;字符串,MyObject>&燃气轮机;在爪哇_Java_Data Structures - Fatal编程技术网

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)
  • 通过对象的ID分隔这些对(
    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()