简化列表,其中每个元素本身都是映射列表

问题描述 投票:0回答:1

用 JSON Parser 解析我的 json 文件后,我在 Java 中得到以下列表:

List< List<HashMap<String,String>>> fields  = jsonContext.read(jsonPath);

此列表中的每个元素本身都是 HashMap 列表,并且来自以下 json 结构:

 [
   {
    "value": "such",
    "name": "yname"
 },
 {
   "value": "Suchwort",
   "name": "yvbeds"
 },
 {
   "value": "",
   "name": "yfix"
 },
 {
   "value": "such",
   "name": "yzielfeld"
  }
 ],
  [
    {
     "value": "ftext",
     "name": "yname"
    },
    {
     "value": "Freitext 1",
     "name": "yvbeds"
    },
    {
      "value": "",
      "name": "yfix"
    },
    {
      "value": "ftext",
      "name": "yzielfeld"
    }
  ],

这个 json 结构创建了四个映射,每个映射都有两个键值对。我想将这四张地图转换为一张地图。我在不使用流的情况下实现了这一点,如下所示:

 List<HashMap<String,String>> newList = new ArrayList<>();

        for(int i=0;i< fields.size();i++) {
            HashMap<String,String> singleMap = new HashMap<>();
            List<HashMap<String,String>> listItem = fields.get(i);
            for(int j=0;j<listItem.size();j++) {
                HashMap<String,String> fieldMap = listItem.get(j);
                singleMap.put(fieldMap.get("name"),fieldMap.get("value"));
            }
            newList.add(singleMap);

        }

我尝试了以下流方法,但收集到地图后,我需要再次收集到列表,但只有地图选项:

   List<HashMap<String,String>> newList = fields.stream()
                 
  .flatMap(List::stream)
 .collect(Collectors.toMap(value->value.get("name"),value->value.get("value")))
                .
java java-8 stream
1个回答
0
投票

从您的非流代码中,您似乎想要将每个内部列表映射到其自己的单独的

Map
中。

因此,您不应该展平(

flatMap
)外部列表。
map
外部列表,以及
collect(toMap)
每个内部列表。

List<Map<String, String>> result = fields.stream()
    .map(
        l -> l.stream().collect(
            // assuming the maps in each inner list do not have duplicate names
            Collectors.toMap(x -> x.get("name"), x -> x.get("value"))
            // if they do, give an appropriate merger function as the 3rd argument
        )
    )
    .toList();
© www.soinside.com 2019 - 2024. All rights reserved.