Картографический поток для получения количества значений во вложенной HashMap - PullRequest
0 голосов
/ 30 апреля 2018

псевдокод,

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);

Наконец, я хочу получить количество всех студенческих заявок (могут быть и другие типы, например, instrutorSubmission и т. Д.), Относящихся к заданию 1. В этом случае 2. Как я могу написать код с Java 8 Streams для достижения этого?

1 Ответ

0 голосов
/ 30 апреля 2018

Вот способ подсчитать все Submission, сделанные studentSubmissions для assignmentid1.

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 (здесь List) внутри Map внутри другого Map. Вложенность в такой степени имеет следующие минусы:

  • Читаемость кода серьезно повреждена.
  • Операции потока должны быть излишне сложными, так как вы можете наблюдать решение, просто посчитав список Submission.

Чтобы избежать такого вложения, вы должны пересмотреть свой Class дизайн. Дифференцирование типа Submission на основе значения String может быть не лучшим выбором. Вы можете перейти на Child классы для StudentSubmission и InstructorSubmission, которые расширят Submission родительский класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...