如何将Java ENUM转换为指定DTO并使用Stream流优化转换代码
问题原因
TicketStatus.values()返回的是枚举对象数组,不是Map结构,没有entrySet()方法,所以你之前的流式写法会编译报错- 你原有for循环的传参有误,第二个参数错传了
getShortName(),不符合name字段对应fullName的映射规则
正确Stream实现
直接用Arrays.stream()把枚举数组转为流处理即可:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; // 转换逻辑 List<TicketStatusTypesDTO> list = Arrays.stream(TicketStatus.values()) .map(ticketStatus -> new TicketStatusTypesDTO( ticketStatus.getShortName(), ticketStatus.getFullName() )) .collect(Collectors.toList());
如果想用DTO的Builder写法可读性更高:
List<TicketStatusTypesDTO> list = Arrays.stream(TicketStatus.values()) .map(ticketStatus -> TicketStatusTypesDTO.builder() .code(ticketStatus.getShortName()) .name(ticketStatus.getFullName()) .build()) .collect(Collectors.toList());
扩展优化(可选)
可以直接把转换逻辑封装为枚举的静态方法,后续调用更方便:
public enum TicketStatus { // 原有枚举值、属性、构造方法、Getter不变 N("new", "New"), A("assigned", "Assigned"), IP("in_progress", "In-progress"), C("closed", "Closed"); private String shortName; private String fullName; TicketStatus(String shortName, String fullName) { this.shortName = shortName; this.fullName = fullName; } @JsonValue public String getShortName() { return shortName; } public String getFullName() { return fullName; } // 新增静态转换方法 public static List<TicketStatusTypesDTO> toDtoList() { return Arrays.stream(values()) .map(status -> new TicketStatusTypesDTO(status.shortName, status.fullName)) .collect(Collectors.toList()); } }
后续直接调用TicketStatus.toDtoList()就能拿到转换后的DTO列表。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

