Map Stream用于获取嵌套HashMap

时间:2018-04-30 03:12:35

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

伪代码,

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编写代码来实现它?

1 个答案:

答案 0 :(得分:1)

以下是计算Submission studentSubmissionsassignmentid1完成的所有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(); 的方法。

Submisson

如果同时删除这两个过滤器,则每个Submission的每种类型的assignment都会计算所有Collection的计数。

但是,我想就另一个ListMap内的Map(此处为Submission)的嵌套做出评论。嵌套到这样的程度有以下缺点:

  • 严重损坏了代码的可读性。
  • 流操作必须不必要地复杂,因为您可以观察解决方案,只计算Class列表。

为了避免这种嵌套,您应该重新考虑Submission设计。根据{{​​1}}值来区分String的类型可能不是最佳选择。您可以使用ChildStudentSubmission的{​​{1}}课程来扩展InstructorSubmission家长课程。