Saltar al contenido

Java8 Streams: ¿compara los valores de objeto de Two List y agrega valor al subobjeto de la primera lista?

Esta reseña fue aprobado por especialistas así se garantiza la veracidad de nuestro tutorial.

Solución:

Dejar listOne.size() es N y listTwo.size() es M. Entonces la solución 2-for-loops tiene una complejidad de O(M*N).

Podemos reducirlo a O(M+N) indexando listTwo por identificadores

Caso 1 – suponiendo listTwo no tiene objetos con el mismo id

// pair each id with its marks
Map marksIndex = listTwo.stream().collect(Collectors.toMap(ObjectTwo::getId, ObjectTwo::getMarks));
// go through list of `ObjectOne`s and lookup marks in the index
listOne.forEach(o1 -> o1.setScore(marksIndex.get(o1.getId())));

Caso 2 – suponiendo listTwo tiene objetos con la misma identificación

    final Map> marksIndex = listTwo.stream()
            .collect(Collectors.groupingBy(ObjectTwo::getId, Collectors.toList()));

    final List result = listOne.stream()
            .flatMap(o1 -> marksIndex.get(o1.getId()).stream().map(o2 -> 
                // make a copy of ObjectOne instance to avoid overwriting scores
                ObjectOne copy = copy(o1);
                copy.setScore(o2.getMarks());
                return copy;
            ))
            .collect(Collectors.toList());

Para implementar copy método, necesita crear un nuevo objeto y copiar los campos uno por uno, pero en tales casos prefiero seguir el patrón Builder. También da como resultado un código más “funcional”.

El siguiente código copia las marcas de ObjectTwo para puntuar en ObjectOne, si ambas identificaciones son iguales, no tiene un objeto intermedio List result

listOne.stream()
    .forEach(one -> listTwo.stream()
        .filter(two -> return two.getId().equals(one.getId());)
        .limit(1)
        .forEach(two -> one.setScore(two.getMarks()););
    );

Esto debería funcionar.

Map collect = listTwo.stream().collect(Collectors.toMap(ObjectTwo::getId, ObjectTwo::getMarks));
listOne
   .stream()
   .filter(item -> collect.containsKey(item.getId()))
   .forEach(item -> item.setScore(collect.get(item.getId())));

Puntuaciones y comentarios

Recuerda algo, que tienes la capacidad de agregar una reseña si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *