使用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
}
}

似乎应该创建一个特定的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
}
}

现有方法应重构为返回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());
}

测试(使用JacksonObjectMapper)

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

最新更新