Quiero elementos del grupo y contar en una lista de sub usando corrientes de Java.
Por ejemplo, tengo una respuesta de tipo AnswerWithOneCorrectOption que se parece a:
class AnswerWithOneCorrectOption {
Long choiceId;
}
Este tipo de respuesta tiene una única opción correcta y se almacena en "AnswerWithOneCorrectOption.id". Estoy streaming a través de una lista de AnswerWithOneCorrectOption de, la agrupación en base a ello y contando usando:
private Map<Long, Long> countChoicesAndGroup(List<AnswerWithOneCorrectOption> answers){
Map<Long, Long> map = answers.parallelStream()
.collect(Collectors.groupingBy(AnswerWithOneCorrectOption::getChoiceId,
Collectors.counting()));
return map;
}
Supongamos que tengo otro tipo de respuesta que puede tener múltiples opciones correctas. Estoy ahorrando esas opciones en List<Long> choiceIds
.
class AnswerWithMultipleCorrectOptions {
List<Long> choiceIds;
}
¿Cómo puede el grupo I por choiceId de en List<Long> choiceIds
y contar?
Si el usuario escogió sólo una opción, que se guardará en answer.id. Si elige más de una respuesta, lo añadiré a la lista answer.ids.
Probablemente es mejor utilizar Answer
con List<Long> ids
solamente. Y en caso que los usuarios elegir sólo una opción: sólo tendrá lista con un elemento. Se le está permitiendo a la agrupación por la respuesta (no se olvide de iguales / hashcode ambos casos):
Map<Answer, Long> collect = answers.stream()
.collect(groupingBy(Function.identity(), counting()));
Pero si desea agrupar por List<Long>
que se puede hacer de la misma manera:
Map<List<Long>, Long> collect = answers.stream()
.collect(groupingBy(Answer::choiceIds, counting()));
Actualización : agrupar por elementos de la lista de sub puede utilizar flatMap
antes:
Map<Long, Long> map = answers.stream()
.flatMap(answer -> answer.getIds().stream())
.collect(groupingBy(Function.identity(), counting()));