简体   繁体   中英

How to filter and merge two java lists

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:

  • We will filter materias with idusuario and then create a map of idmateria to materias
  • Next we will filter 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM