当前位置: 首页 > 知识库问答 >
问题:

java8 Stream List如何在分组后隐藏Map by

贺桐
2023-03-14

我从mysql中选择了一些数据。然后我想格式化它。数据如下所示:

var json = [
  {
    "date": "2016-01",
    "number": "1",
    "code": "420000",
    "type": "false"
  },
  {
    "date": "2016-01",
    "number": "2",
    "code": "440000",
    "type": "false"
  },
  {
    "date": "2016-02",
    "number": "3",
    "code": "420000",
    "type": "false"
  },
  {
    "date": "2016-03",
    "number": "4",
    "code": "420000",
    "type": "true"
  },
  {
    "date": "2016-03",
    "number": "5",
    "code": "410000",
    "type": "false"
  },
  {
    "date": "2016-03",
    "number": "6",
    "code": "440000",
    "type": "true"
  },
  {
    "date": "2016-04",
    "number": "7",
    "code": "420000",
    "type": "false"
  },
  {
    "date": "2016-04",
    "number": "8",
    "code": "440000",
    "type": "false"
  }
];
console.log(json);

我想groupingBydate,和partitioningBytype,并缩小为地图。在格式化数据之后,就像

var json = {
  "2016-01": {
    "false": {
      "420000": "1",
      "440000": "2"
    }
  },
  "2016-02": {
    "false": {
      "420000": "3"
    }
  },
  "2016-03": {
    "false": {
      "410000": "5"
    },
    "true": {
      "420000": "4",
      "440000": "6"
    }
  },
  "2016-04": {
    "false": {
      "420000": "7",
      "440000": "8"
    }
  }
};
console.log(json);

我编码java8流

public static void main(String[] args) {
    List<Map<String, String>> postmans = new ArrayList<>();

    // "420000" : post area code, "false": just paper(without goods)
    postmans.add(createMap("2016-01", "1", "420000", "false"));
    postmans.add(createMap("2016-01", "2", "440000", "false"));
    postmans.add(createMap("2016-02", "3", "420000", "false"));
    postmans.add(createMap("2016-03", "4", "420000", "true"));
    postmans.add(createMap("2016-03", "5", "410000", "false"));
    postmans.add(createMap("2016-03", "6", "440000", "true"));
    postmans.add(createMap("2016-04", "7", "420000", "false"));
    postmans.add(createMap("2016-04", "8", "440000", "false"));

    // before, I use fastjson Library
    System.out.println(JSONObject.toJSONString(postmans));


    Map<String, Map<Boolean, Map>> data = postmans.stream()
            .collect(Collectors.groupingBy(d -> d.get("date"), TreeMap::new,
                    Collectors.partitioningBy(d-> d.get("type").equals("true"),
                            Collectors.reducing(new HashMap(), (d1, d2)->{
                                Object code = d2.get("code");
                                Object number = d2.get("number");
                                // I think bug in reducing
                                d1.put(code, number);
                                return d1;
                            }))));
    // after, I use fastjson Library
    System.out.println(JSONObject.toJSONString(data));

}

private static Map<String,String> createMap(String date, String number, String code, String type){
    Map<String, String> map = new HashMap<>();
    map.put("date", date);
    map.put("number", number);
    map.put("code", code);
    map.put("type", type);
    return map;
}

但是,真正的结果是

var json = {
  "2016-01": {
    "false": {
      "410000": "5",
      "420000": "7",
      "440000": "8"
    },
    "true": {
      "410000": "5",
      "420000": "7",
      "440000": "8"
    }
  },
  "2016-02": {
    "false": {
      "410000": "5",
      "420000": "7",
      "440000": "8"
    },
    "true": {
      "410000": "5",
      "420000": "7",
      "440000": "8"
    }
  },
  "2016-03": {
    "false": {
      "410000": "5",
      "420000": "7",
      "440000": "8"
    },
    "true": {
      "410000": "5",
      "420000": "7",
      "440000": "8"
    }
  },
  "2016-04": {
    "false": {
      "410000": "5",
      "420000": "7",
      "440000": "8"
    },
    "true": {
      "410000": "5",
      "420000": "7",
      "440000": "8"
    }
  }
};
console.log(json);

我认为这个bug的原因在reduing。当分区通过得到一个新的List

我只想partitioningByresult,每个列表

我很抱歉代码太长了,我的英语很差。谢谢你帮我!


共有1个答案

汪建德
2023-03-14

这里有两个主要错误。Collectors.reducing,因为这是一个缩减,需要一直返回一个新实例,基本上第二个是你的逻辑有缺陷:

Map<String, Map<Boolean, Map<String, String>>> data = postmans.stream()
            .collect(Collectors.groupingBy(
                    d -> d.get("date"),
                    TreeMap::new,
                    Collectors.partitioningBy(
                            d -> d.get("type").equals("true"),
                            Collectors.reducing(
                                    new HashMap<>(),
                                    (left, right) -> {

                                        Map<String, String> map = new HashMap<>();

                                        String leftCode = left.get("code");
                                        String leftNumber = left.get("number");

                                        if (leftCode == null) {
                                            map.putAll(left);
                                        } else {
                                            map.put(leftCode, leftNumber);
                                        }

                                        String rightCode = right.get("code");
                                        String rightNumber = right.get("number");

                                        map.put(rightCode, rightNumber);

                                        return map;

                                    }))));

您还存在将日期存储为字符串和执行树映射::新建-基本上对字符串排序的问题,这可能不是您想要的排序。一般来说,将所有内容都作为字符串的整个方法使得代码几乎不可读。

 类似资料:
  • 由于使用分组样式的表视图的设计在iOS 7中发生了很大的变化,我想隐藏(或删除)第一节标题。到目前为止,我还没有做到这一点。 经过简化,我的代码如下所示: 如果我返回的高度为0,则不会使用节索引0调用其他两个方法。但是,仍然使用默认高度绘制空节标题。(在iOS 6中,调用这两个方法。但是,可见结果是相同的。) 如果返回不同的值,则节标题将获得指定的高度。 如果我返回0.01,它几乎是正确的。然而,

  • 我试过这个: 我得到了这个错误:

  • 问题内容: 单击Dialog_01的按钮 将隐藏 其窗口并打开Dialog_02。单击Dialog_02的按钮应 关闭 其窗口并 取消隐藏Dialog_01。如何实现呢? 问题答案: 将第一个窗口作为第二个窗口的父窗口: 如果您希望每次都显示相同的对话框,请执行以下操作: 和子窗口,而不是关闭它。

  • 问题内容: 如何使用JSF显示/隐藏组件?我目前正尝试在javascript的帮助下做同样的事情,但没有成功。我不能使用任何第三方库。 谢谢| 阿比 问题答案: 通常,您需要通过其clientId获得该控件的句柄。本示例使用带有请求范围绑定的JSF2 Facelets视图来获取另一个控件的句柄: 确切的操作方式取决于您正在使用的JSF版本。有关较早的JSF版本,请参见此博客文章:JSF:使用组件标

  • 问题内容: 现在我有两个视图控制器。我的问题是,更改为第二个视图控制器后,我不知道如何隐藏后退按钮。主要是我在Objective-C中找到的参考。如何快速编码? 在Objective-C中隐藏后退按钮代码 问题答案: 根据该文件为:

  • 问题内容: 如何在Flutter应用中隐藏Android状态栏? 问题答案: SystemChrome.setEnabledSystemUIOverlays([]) 应该做你想做的。 您可以将其带回。 使用导入