Как группировать и считать элементы в подсписке, используя потоки Java - PullRequest
0 голосов
/ 04 марта 2019

Я хочу сгруппировать и подсчитать элементы в подсписке, используя потоки Java.

Например, у меня есть ответ типа AnswerWithOneCorrectOption, который выглядит следующим образом:

class AnswerWithOneCorrectOption {
     Long choiceId;
}

Этот тип ответаимеет только одну правильную опцию и хранится в "AnswerWithOneCorrectOption.id".Я выполняю потоковую передачу по списку AnswerWithOneCorrectOption, группирую их по идентификатору и рассчитываю с использованием:

private Map<Long, Long> countChoicesAndGroup(List<AnswerWithOneCorrectOption> answers){

Map<Long, Long> map = answers.parallelStream()
             .collect(Collectors.groupingBy(AnswerWithOneCorrectOption::getChoiceId, 
 Collectors.counting())); 

 return map;
}

Предположим, у меня есть другой тип ответа, который может иметь несколько правильных параметров.Я сохраняю эти опции в List<Long> choiceIds.

class AnswerWithMultipleCorrectOptions {
     List<Long> choiceIds;
}

Как я могу сгруппировать по choiceId в List<Long> choiceIds и считать?

1 Ответ

0 голосов
/ 04 марта 2019

Если пользователь выбрал только один вариант, он будет сохранен в answer.id.Если он выберет более одного ответа, я добавлю его в список answer.ids.

Возможно, лучше использовать Answer только с List<Long> ids.И в случае, если пользователь выбрал только один вариант, у вас будет просто список с одним элементом.Это позволяет вам группировать по ответу (не забывайте про equals / hashcode) в обоих случаях:

Map<Answer, Long> collect = answers.stream()
        .collect(groupingBy(Function.identity(), counting()));

Но если вы хотите сгруппировать по List<Long>, это можно сделать так же:

Map<List<Long>, Long> collect = answers.stream()
            .collect(groupingBy(Answer::choiceIds, counting()));

Обновление : для группировки по элементам в подсписке вы можете использовать flatMap до:

Map<Long, Long> map = answers.stream()
        .flatMap(answer -> answer.getIds().stream())
        .collect(groupingBy(Function.identity(), counting()));
...