I need to join two lists, but I need to make a filter, I use lambda but I can't evolve
list1:
{
"idMateria": 9,
"idUsuario": 7,
"materia": "portugues",
"descricao": "desc"
},
{
"idMateria": 10,
"idUsuario": 7,
"materia": "matematica",
"descricao": "desc"
}
{
"idMateria": 10,
"idUsuario": 4,
"materia": "matematica",
"descricao": "desc"
}
list2:
{
"idNotaMateria": 6,
"idMateria": 234,
"idUsuario": 7,
"notaMateria": 432.0,
},
{
"idNotaMateria": 1,
"idMateria": 10,
"idUsuario": 7,
"notaMateria": 4.0,
},
{
"idNotaMateria": 1,
"idMateria": 10,
"idUsuario": 7,
"notaMateria": 4.0,
}
result:
{
"idNotaMateria": 1,
"idMateria": 10,
"idUsuario": 7,
"notaMateria": 4.0,
"materia": "matematica"
},
{
"idNotaMateria": 1,
"idMateria": 10,
"idUsuario": 7,
"notaMateria": 4.0,
"materia": "matematica"
}
it is necessary to create a new list by filtering by the idusuario field and merging the columns, until now they can only reproduce the separate lists
List notasMaterias = repository.findAll(Sort.by("dataNota").descending()); List materias = materiaRepository.findAll();
List<NotasMateria> filter1 =
notasMaterias.stream()
.filter(t -> t.getIdUsuario()== idusuario)
.collect(Collectors.toList());
List<Materia> filter2 = materias.stream()
.filter(t ->t.getIdUsuario().equals(idusuario) )
.collect(Collectors.toList());
Approach:
materias
with idusuario
and then create a map of idmateria
to materias
nonmaterias
stream with idusuario
and also filter based on idMateria
comparing the earlier map.Code:
public List<Merged> filterAndMerge(List<Materia> materiaList, List<NonMateria> nonMateriaList, int idusuario) {
Map<Integer, Materia> materiaMap = materiaList.stream()
.filter(m -> m.getIdUsuario() == idusuario)
.collect(Collectors.toMap(Materia::getIdMateria, m -> m));
return nonMateriaList.stream()
.filter(nm -> nm.getIdUsuario() == idusuario)
.filter(nm -> materiaMap.containsKey(nm.getIdMateria()))
.map(nm -> new Merged(nm, materiaMap.get(nm.getIdMateria())
.getMateria()))
.collect(Collectors.toList());
}
Note: I have created Merged
class consisting of all fields required in the result. It contains a constructor that takes class NonMateria
and string materia
as parameters.
public Merged(NonMateria nm, String materia) {
this.idNotaMateria = nm.getIdNotaMateria();
this.idMateria = nm.getIdMateria();
this.idUsuario = nm.getIdUsuario();
this.notaMateria = nm.getNotaMateria();
this.materia = materia;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.