【问题标题】:How to filter and merge two java lists如何过滤和合并两个java列表
【发布时间】:2021-03-01 15:13:51
【问题描述】:

我需要加入两个列表,但我需要做一个过滤器,我使用 lambda 但我无法进化

列表1:

        {
            "idMateria": 9,
            "idUsuario": 7,
            "materia": "portugues",
            "descricao": "desc"
        },
        {
            "idMateria": 10,
            "idUsuario": 7,
            "materia": "matematica",
            "descricao": "desc"
        }
        {
            "idMateria": 10,
            "idUsuario": 4,
            "materia": "matematica",
            "descricao": "desc"
        }

列表2:

    {
        "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,

    }

结果:

{
    "idNotaMateria": 1,
    "idMateria": 10,
    "idUsuario": 7,
    "notaMateria": 4.0,
     "materia": "matematica"

},
{
    "idNotaMateria": 1,
    "idMateria": 10,
    "idUsuario": 7,
    "notaMateria": 4.0,
     "materia": "matematica"

}

需要通过idusuario字段过滤并合并列来创建新列表,直到现在它们只能重现单独的列表

列出 notasMaterias = repository.findAll(Sort.by("dataNota").descending()); 列出 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());

【问题讨论】:

  • 你的过滤和合并规则是什么?
  • 过滤具有相同字段 idUsuario 和 Materia 的列表,并从 list2 添加 materia 字段,请帮助我

标签: java json lambda


【解决方案1】:

方法:

  • 我们将用idusuario过滤materias,然后创建一个idmateriamaterias的映射
  • 接下来,我们将使用idusuario 过滤nonmaterias 流,并根据idMateria 与之前的映射进行比较。

代码:

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

}

注意: 我创建了 Merged 类,其中包含结果中所需的所有字段。它包含一个以class NonMateria 和字符串materia 作为参数的构造函数。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 2017-08-22
    • 1970-01-01
    • 2015-06-11
    • 2016-01-17
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多