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
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)