java处理列表数据使之包含全部状态

问题引出:
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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值