首页 > 解决方案 > 使用 lambda Java 将列表创建更改为 json

问题描述

我需要更改响应类型。

在该部分代码中创建响应

public Map<String, Double> buscaNotavsTipo(Integer idusuario){
    List<NotasMateria> notasMaterias = repository.findAll();
    Map<String, Double> filtered = notasMaterias.stream().
            filter(t -> t.getIdUsuario()== idusuario)
            .collect(Collectors.groupingBy(NotasMateria::getTipoNota,
                     Collectors.mapping(NotasMateria::getNotaMateria,
                             averagingDouble(Double::doubleValue))));
     return  filtered;
}

他带来了这个答案

  {
tipo_nota: Trabalho
nota: 8.2
tipo_nota: Prova
nota: 5.7
}

我需要这种响应格式

    {
  {
    tipo_nota: Trabalho
    nota: 8.2
  },
  {
    tipo_nota: Prova
    nota: 5.7
  }
}

标签: javajsonlambda

解决方案


似乎应该创建一个特定的 DTO 来表示输出,并且应该返回这些 DTO 的列表而不是Map<String, Double>.

DTO 的示例实现(使用 Lombok)。

此外,还提供了一个特殊的构造函数来促进转换为Map.Entry<String, Double>DTO 实例,这将允许将 DTO 构造函数用作方法引用。

@Data
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
class Output {
    private String tipoNota;
    private double nota;

    public Output(Map.Entry<String, Double> entry) {
        this(entry.getKey(), entry.getValue()); // call all-args constructor provided by Lombok
    }
}

现有方法应重构为 return List<Output>

public static List<Output> buscaNotavsTipoList(List<NotasMateria> notasMaterias, Integer idusuario) {
        return notasMaterias.stream()
                .filter(t -> t.getIdUsuario()== idusuario)
                .collect(Collectors.groupingBy(NotasMateria::getTipoNota,
                        Collectors.mapping(NotasMateria::getNotaMateria,
                                averagingDouble(Double::doubleValue))))
                .entrySet().stream()
                .map(Output::new)
                .collect(Collectors.toList());
}

测试(使用杰克逊ObjectMapper

ObjectMapper mapper = new ObjectMapper();

String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(
        buscaNotavsTipoList(
                Arrays.asList(
                        new NotasMateria(1, "Trabalho", 8.0),
                        new NotasMateria(1, "Trabalho", 8.4),
                        new NotasMateria(1, "Prova", 5.9),
                        new NotasMateria(1, "Prova", 5.5)
                ),
                1
        ));

        System.out.println(json);

输出

[ {
  "tipo_nota" : "Trabalho",
  "nota" : 8.2
}, {
  "tipo_nota" : "Prova",
  "nota" : 5.7
} ]


推荐阅读