es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    Map<long,></long,><questiondto>> groupedQuestions = questionEventDTOList.stream()
        .collect(Collectors.groupingBy(QuestionEventDTO::getId,
                Collectors.mapping(QuestionEventDTO::getQuestion, Collectors.toList())));
    
    List<questioneventdto> groupedQuestionEvents = groupedQuestions.entrySet().stream()
        .map(entry -> new QuestionEventDTO(entry.getKey(), null, entry.getValue()))
        .collect(Collectors.toList());
    
    // donde questionEventDTOList es la lista de QuestionEventDTOs que estás obteniendo de la base de datos
    // y groupedQuestionEvents es la lista de QuestionEventDTOs con QuestionDTOs agrupados
    

    Explicación:

    • Primero usamos el método stream() en questionEventDTOList para obtener un stream de objetos QuestionEventDTO.
    • Luego usamos el método groupingBy() con la función QuestionEventDTO::getId como criterio de agrupación. Esto crea un Map<long,></long,><questioneventdto>> donde las claves son los ids de QuestionEventDTO y los valores son listas de objetos QuestionEventDTO con el mismo id.
    • Usamos el método mapping() con la función QuestionEventDTO::getQuestion para extraer los objetos QuestionDTO de cada objeto QuestionEventDTO en las listas. Esto crea un Map<long,></long,><questiondto>> donde las claves son los ids de QuestionEventDTO y los valores son listas de objetos QuestionDTO con el mismo id.
    • Finalmente, usamos el método stream() en entrySet() del mapa groupedQuestions para obtener un stream de objetos Map.Entry<long,></long,><questiondto>>, y map() cada entrada a un nuevo objeto QuestionEventDTO con null para el campo QuestionDTO y la lista de objetos QuestionDTO para el campo questions. Esto crea una lista de objetos QuestionEventDTO con objetos QuestionDTO agrupados.

    ¡Espero que esto ayude! Avísame si tienes alguna pregunta.

Comments are closed.