如何使用java streams对子列表中的元素进行分组和计数

如何使用java streams对子列表中的元素进行分组和计数,java,java-stream,grouping,counting,Java,Java Stream,Grouping,Counting,我想使用java流对子列表中的元素进行分组和计数 例如,我有一个AnswerWithOneCorrect选项类型的答案,如下所示: class AnswerWithOneCorrectOption { Long choiceId; } 此答案类型只有一个正确选项,并存储在“AnswerWithOneCorrectOption.id”中。我正在浏览一个带有一个正确选项的回答列表,根据id进行分组,并使用以下方法计数: private Map<Long, Long> coun

我想使用java流对子列表中的元素进行分组和计数

例如,我有一个AnswerWithOneCorrect选项类型的答案,如下所示:

class AnswerWithOneCorrectOption {
     Long choiceId;
}
此答案类型只有一个正确选项,并存储在“AnswerWithOneCorrectOption.id”中。我正在浏览一个带有一个正确选项的回答列表,根据id进行分组,并使用以下方法计数:

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

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

 return map;
}
private Map countChoicesAndGroup(列出答案){
Map Map=answers.parallelStream()
.collect(收集器.groupingBy(AnswerWithOneCorrectOption::getChoiceId、,
收集器。计数();
返回图;
}
假设我有另一个答案类型,可以有多个正确的选项。我正在将这些选项保存在
列表选项ID

class AnswerWithMultipleCorrectOptions {
     List<Long> choiceIds;
}
具有多个更正选项的类应答{
列出选项ID;
}
如何在
列表选项ID
中按选项ID分组并计数

如果用户只选择了一个选项,它将保存在answer.id中。如果他选择了多个答案,我会将其添加到answer.ids列表中

最好只使用
列表ID
应答
。若用户只选择了一个选项,那个么列表中只有一个元素。它允许您按答案分组(不要忘记equals/hashcode)这两种情况:

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

我不明白你怎么想找到“多个”选项。您的意思是要对照整个
id
列表检查正确答案,而不是
getId
?这是如何工作的,你能给我们展示一个循环而不是一个流吗?你能展示一些样本输入和输出吗?是的。如果用户只选择了一个选项,它将保存在answer.id中。如果他选择了多个答案,我会将其添加到answer.ids列表中。我在问题中提到的代码适用于answer.id。如果我有answer.id而不是answer.id,我如何分组和计数?是否有可能
id
id
中重复?换句话说,
id
是否总是与
ids
中的所有答案不同,或者它是否可以包含在
ids
列表中?(顺便说一句,这是一个糟糕的设计。最好只是有一个答案列表,如果用户只选择一个,那么列表的长度是1。)你期望什么类型的映射?我可以使用Answer::getIds()获得映射。有什么方法可以通过分组和计算子列表中的元素来获取地图吗?就是这样。谢谢@Rusian
Map<List<Long>, Long> collect = answers.stream()
            .collect(groupingBy(Answer::choiceIds, counting()));
Map<Long, Long> map = answers.stream()
        .flatMap(answer -> answer.getIds().stream())
        .collect(groupingBy(Function.identity(), counting()));