Utilice lambda para agrupar un objeto dentro de una lista según el Id de la lista.
Buenas noches, necesito ayuda para agrupar una lista de objetos utilizando Java 8 (lambda).
Tengo mi entidad QuestionEventDTO:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class QuestionEventDTO {
public Long id;
public QuestionDTO question;
public List<QuestionDTO> questions;
}
Y cuando consulto la base de datos, obtengo esta respuesta:
QuestionEventDTO [id=1, question= QuestionDTO [id=1, description=”¿Eres desarrollador?”], questions =[]]
QuestionEventDTO [id=1, question= QuestionDTO [id=2, description=”¿Qué tal puntuación?”], questions = []]
QuestionEventDTO [id=2, question= QuestionDTO [id=3, description=”¿Cómo se llama tu perro?”], questions = []]
QuestionEventDTO [id=2, question= QuestionDTO [id=4, description=”¿Eres desarrollador?”], questions = []]
Sin embargo, note que los identificadores de EventQuestion están repetidos, y solo el objeto QuestionDto tiene identificadores diferentes. Me gustaría agrupar los QuestionDto en un solo QuestionEvent, quedando así:
QuestionEventDTO [id=1, question= null, questions =[ QuestaoDTO [id=1, description=”¿Eres desarrollador?”], QuestaoDTO [id=2, description=”¿Qué tal puntuación?”] ] ]
QuestionEventDTO [id=2, question= null, questions =[ QuestaoDTO [id=3, description=”¿Cómo se llama tu perro?”], QuestaoDTO [id=4, description=”¿Eres desarrollador?” ] ] ]
¿Podría alguien ayudarme a encontrar una buena solución utilizando lambda? Que sea rápida y eficiente. Gracias.
davy.ai
Por supuesto, aquí hay una solución para agrupar los objetos QuestionDTO basados en sus ids de QuestionEventDTO mediante expresiones lambda de Java 8:
Explicación:
stream()
enquestionEventDTOList
para obtener un stream de objetosQuestionEventDTO
.groupingBy()
con la funciónQuestionEventDTO::getId
como criterio de agrupación. Esto crea unMap<long,></long,><questioneventdto>>
donde las claves son los ids deQuestionEventDTO
y los valores son listas de objetosQuestionEventDTO
con el mismo id.mapping()
con la funciónQuestionEventDTO::getQuestion
para extraer los objetosQuestionDTO
de cada objetoQuestionEventDTO
en las listas. Esto crea unMap<long,></long,><questiondto>>
donde las claves son los ids deQuestionEventDTO
y los valores son listas de objetosQuestionDTO
con el mismo id.stream()
enentrySet()
del mapagroupedQuestions
para obtener un stream de objetosMap.Entry<long,></long,><questiondto>>
, ymap()
cada entrada a un nuevo objetoQuestionEventDTO
connull
para el campoQuestionDTO
y la lista de objetosQuestionDTO
para el campoquestions
. Esto crea una lista de objetosQuestionEventDTO
con objetosQuestionDTO
agrupados.¡Espero que esto ayude! Avísame si tienes alguna pregunta.