Quero elementos do grupo e contar em uma lista sub usando fluxos java.
Por exemplo, eu tenho uma resposta do tipo AnswerWithOneCorrectOption que se parece com:
class AnswerWithOneCorrectOption {
Long choiceId;
}
Este tipo de resposta tem apenas uma opção correta e é armazenado em "AnswerWithOneCorrectOption.id". Estou fluindo através de uma lista de AnswerWithOneCorrectOption de, agrupamento com base na identificação e contagem usando:
private Map<Long, Long> countChoicesAndGroup(List<AnswerWithOneCorrectOption> answers){
Map<Long, Long> map = answers.parallelStream()
.collect(Collectors.groupingBy(AnswerWithOneCorrectOption::getChoiceId,
Collectors.counting()));
return map;
}
Suponha que eu tenho um outro tipo de resposta que pode ter várias opções corretas. Estou guardando essas opções em List<Long> choiceIds
.
class AnswerWithMultipleCorrectOptions {
List<Long> choiceIds;
}
Como posso grupo por choiceId de em List<Long> choiceIds
e contar?
Se o usuário escolher apenas uma opção, ele será salvo em answer.id. Se ele escolher mais de uma resposta, eu vou adicioná-lo à lista answer.ids.
É provavelmente melhor para uso Answer
com List<Long> ids
somente. E no caso de usuário escolheu apenas uma opção que você só vai ter lista com um elemento. É o que lhe permite agrupar por resposta (não se esqueça sobre igual / hashCode) ambos os casos:
Map<Answer, Long> collect = answers.stream()
.collect(groupingBy(Function.identity(), counting()));
Mas se você deseja agrupar por List<Long>
isso pode ser feito da mesma maneira:
Map<List<Long>, Long> collect = answers.stream()
.collect(groupingBy(Answer::choiceIds, counting()));
Atualização : agrupar por elementos da lista sub você pode usar flatMap
antes:
Map<Long, Long> map = answers.stream()
.flatMap(answer -> answer.getIds().stream())
.collect(groupingBy(Function.identity(), counting()));