java - 使用 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
}
}
现有方法应重构为 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
} ]
推荐阅读
- flutter - 颤振未定义的名称“上下文”。尝试将名称更正为已定义的名称,或定义名称
- python - python - 使用带有Python的selenium webdriver打开时如何关闭切换开关
- javascript - javascript (2020) 中没有令牌的 Twitter 关注者计数?
- php - Laravel 缺少路由所需的参数:verification.notice
- reactjs - 在redux reducers中更新时,不应该是state.slice().map而不是state.map()吗?
- c# - 如何将 lambda 坐标输出插入 KeyValuePair?
- python-3.x - 打印从今天开始的日历
- python - 尝试保存张量流模型时,模块“h5py”没有属性“文件”
- excel - 如果列中的单元格包含特定单词,则剪切特定单词的行
- javascript - 嗨,当我开始滚动时,如何将徽标从左上角移动到中心。谢谢