【问题标题】:Map Stream for get count of values in a nested HashMap用于获取嵌套 HashMap 中的值计数的 Map Stream
【发布时间】:2018-10-10 03:11:24
【问题描述】:

伪代码,

Map <String, HashMap<String,List<Submission>>> assignmentMap = new HashMap();

Map <String, List<Submission>> submissionMap = new HashMap();

List <Submission> ls = new ArrayList();
ls.add(new Submission("student1"));
ls.add(new Submission("student2"));

submissionMap.put("studentSubmissions", ls);

assignmentMap.put("assignmentid1", submissionMap);

最后我想获取所有 studentSubmissions 的计数(也可以有其他类型,如 instrutorSubmission 等)属于作业 1。在这种情况下 2。我如何使用 Java 8 Streams 编写代码来实现它?

【问题讨论】:

  • 在你甚至 contemplate 使用流之前,停止使用 raw 泛型,例如第一行应该是Map&lt;String, Map&lt;String, List&lt;String&gt;&gt;&gt; assignmentMap = new HashMap&lt;&gt;(); --- 第二行根本没有任何类型参数,所以不能很好地与流一起使用!!
  • 什么是map2
  • 更正了代码
  • 列表ls 的类型为String。但是,new Submission("student1") 将返回 Submission 类型的对象。请适当地编辑问题。
  • @Harshana,如果您在回复评论时编辑您的问题,请回复,以便用户收到编辑通知。

标签: java lambda collections java-8 java-stream


【解决方案1】:

这是计算studentSubmissionsassignmentid1 完成的所有Submission 的方法。

long a = assignmentMap.entrySet().stream().
            filter(e -> e.getKey().equals("assignmentid1")).
            flatMap(i -> i.getValue().entrySet().stream()).
            filter(k -> k.getKey().equals("studentSubmissions")).
            flatMap(j -> j.getValue().stream()).
            count();

如果您删除这两个过滤器,您将获得每个assignment 的每种Submission 的所有Submisson 的计数。

但是,我想就Collection(这里是List)在另一个Map 中嵌套另一个Map 发表评论。嵌套到这样的程度有以下缺点:

  • 代码的可读性严重受损。
  • 流操作必须过于复杂,因为您可以观察解决方案来仅计算 Submission 列表。

为了避免这种嵌套,您应该重新考虑您的Class 设计。根据String 值区分Submission 的类型可能不是最佳选择。您可以为 StudentSubmissionInstructorSubmission 选择 Child 类,这将扩展 Submission 父类。

【讨论】:

  • @Harshana,这能回答你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2017-03-12
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多