问题引出:
springboot项目,要统计某个状态分布数据,如果我按状态分组查询后得到的状态分布列表数据,返回给前端,前端既要让我处理中文(即状态返回中文),也要让我把所有状态的数据都返回(即如果这个状态没有数量,则数量默认返回个0),我该怎么处理呢?
可以有两种方式来处理这个问题
首先定义状态枚举
public enum StatusEnum {
STATUS_0(0, "状态一"),
STATUS_1(1, "状态二"),
STATUS_2(2, "状态三");
private final int code;
private final String description;
StatusEnum(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
public static String getDescriptionByCode(int code) {
for (StatusEnum status : StatusEnum.values()) {
if (status.getCode() == code) {
return status.getDescription();
}
}
return "未知状态";
}
}
定义数据库查询结果的DTO(数据传输对象)
public class StatusCountDTO {
private int code;
private String description;
private int count;
// getters and setters
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
方式1
先遍历枚举,构建一个包含所有状态的Map,键是状态码,值是StatusCountDTO对象,再遍历查询结果,更新Map中对应状态的数量,将Map的值转换为List并返回。
代码举例:
@Service
public class StatusService {
@Autowired
private StatusRepository statusRepository; // 假设StatusRepository是一个接口,用于数据库交互
public List<StatusCountDTO> getStatusDistribution() {
// 从数据库获取状态分布数据,这里假设是一个List<StatusCountEntity>,其中StatusCountEntity有状态码和数量
List<StatusCountEntity> statusCountList = statusRepository.getStatusCounts();
// 构建一个包含所有状态的Map,键是状态码,值是StatusCountDTO对象
Map<Integer, StatusCountDTO> statusMap = new HashMap<>();
for (StatusEnum status : StatusEnum.values()) {
StatusCountDTO dto = new StatusCountDTO();
dto.setCode(status.getCode());
dto.setDescription(status.getDescription());
dto.setCount(0); // 初始化数量为0
statusMap.put(status.getCode(), dto);
}
// 遍历查询结果,更新Map中对应状态的数量
for (StatusCountEntity entity : statusCountList) {
StatusCountDTO dto = statusMap.get(entity.getCode());
if (dto != null) {
dto.setCount(entity.getCount());
}
}
// 将Map的值转换为List并返回
return new ArrayList<>(statusMap.values());
}
}
方式2
将查询结果转换为Map,再遍历枚举,构建最终的List。
代码举例:
import java.util.*;
import java.util.stream.Collectors;
// 假设你有一个方法从数据库获取数据
List<StatusCountEntity> queryResults = // ... 从数据库获取的数据
// 将查询结果转换为StatusCountDTO的Map
Map<Integer, StatusCountDTO> statusMap = queryResults.stream()
.collect(Collectors.toMap(
result -> result.get("code"), // 状态码作为键
result -> {
StatusCountDTO dto = new StatusCountDTO();
dto.setCode(result.get("code"));
dto.setCount(result.get("count"));
// 注意:这里没有设置description,因为我们稍后会从枚举中获取
return dto;
},
(existing, replacement) -> existing // 如果有重复键,保留现有的值(这里不应该有重复,除非数据有问题)
));
// 遍历枚举,构建最终的List
List<StatusCountDTO> statusList = new ArrayList<>();
for (StatusEnum status : StatusEnum.values()) {
StatusCountDTO dto = statusMap.getOrDefault(status.getCode(), new StatusCountDTO());
dto.setCode(status.getCode());
dto.setDescription(status.getDescription()); // 从枚举中获取描述
dto.setCount(dto.getCount() != null ? dto.getCount() : 0); // 如果Map中没有,则数量为0
statusList.add(dto);
}
// 如果列表数据比较简单,可直接构建一个类似以下Map(这里假设是一个Map<Integer, Integer>,键是状态码,值是数量)
Map<Integer, Integer> statusCounts;
// 构建一个包含所有状态的列表
List<StatusCountDTO> statusList = new ArrayList<>();
for (StatusEnum status : StatusEnum.values()) {
int count = statusCounts.getOrDefault(status.getCode(), 0);
StatusCountDTO dto = new StatusCountDTO();
dto.setCode(status.getCode());
dto.setDescription(status.getDescription());
dto.setCount(count);
statusList.add(dto);
}
另外,如果不需要返回全部状态,仅仅只需处理中文(即状态不返回数字,返回中文),则可以通过以下方式处理列表
@Service
public class StatusService {
public List<StatusDTO> getStatusList() {
List<StatusDTO> statusList = new ArrayList<>();
// 假设这是从数据库或其他地方获取的状态列表
List<Integer> statusCodes = Arrays.asList(0, 1, 2);
for (Integer statusCode : statusCodes) {
StatusDTO dto = new StatusDTO();
dto.setCode(statusCode);
dto.setDescription(StatusEnum.getDescriptionByCode(statusCode));
statusList.add(dto);
}
return statusList;
}
}