
本教程详细介绍了如何利用java stream api,将包含自定义标签的枚举类型高效转换为一个包含枚举名称和对应标签的自定义数据传输对象(dto)列表。通过实例代码,演示了如何将枚举值流式处理并映射到新的列表结构,从而简化了枚举数据在应用层面的使用和展示。
在Java开发中,枚举(Enum)是一种强大的工具,用于定义一组固定的常量。它们不仅可以包含简单的名称,还可以通过添加字段和构造函数来关联额外的属性,例如描述、代码或自定义标签。然而,在许多应用场景中,我们可能需要将这些枚举数据转换为更灵活的结构,例如用于API响应、前端展示或与其他系统集成。这种转换通常涉及将枚举的名称与其自定义属性组合成一个标准的数据传输对象(DTO)列表。
本文将详细讲解如何利用Java 8及更高版本提供的Stream API,优雅地实现将一个带有自定义标签的枚举转换为一个包含枚举名称和标签的自定义列表对象。
首先,我们定义一个包含自定义标签的枚举类型,以及一个用于承载转换结果的目标数据传输对象(DTO)。
假设我们有一个表示产品操作的枚举,每个操作除了其常量名称外,还有一个用户友好的显示标签:
立即学习“Java免费学习笔记(深入)”;
public enum ProductActions {
BUY("Buy"),
SELL("Sell"),
Transfer("Transfer"); // 注意:Java枚举常量之间用逗号分隔,最后一个分号结束
public final String label; // 定义一个公共的final字段来存储标签
ProductActions(String label) {
this.label = label;
}
// 可选:提供一个getter方法以更好地封装
public String getLabel() {
return label;
}
}在这个枚举中,BUY、SELL 和 Transfer 是枚举常量,它们各自关联了一个字符串 label。
接下来,我们定义一个简单的POJO(Plain Old Java Object)或DTO,用于存储每个产品操作的名称和其对应的标签:
// 使用Lombok注解可以简化此类,但此处为清晰起见,省略Lombok,假设已提供构造函数和getter/setter
// import lombok.Data;
// import lombok.Builder;
// import lombok.NoArgsConstructor;
// import lombok.AllArgsConstructor;
public class ProductActionItem {
private String productAction; // 对应枚举的名称
private String productLabel; // 对应枚举的自定义标签
// 构造函数,用于方便地创建实例
public ProductActionItem(String productAction, String productLabel) {
this.productAction = productAction;
this.productLabel = productLabel;
}
// Getters and Setters (Lombok的@Data注解会自动生成)
public String getProductAction() { return productAction; }
public void setProductAction(String productAction) { this.productAction = productAction; }
public String getProductLabel() { return productLabel; }
public void setProductLabel(String productLabel) { this.productLabel = productLabel; }
@Override
public String toString() {
return "ProductActionItem{" +
"productAction='" + productAction + '\'' +
", productLabel='" + productLabel + '\'' +
'}';
}
}ProductActionItem 类有两个字段,分别用于存储枚举的常量名(例如 "BUY")和其自定义标签(例如 "Buy")。
Java Stream API 提供了一种声明式且高效的方式来处理集合数据。我们将利用 Arrays.stream()、map() 和 toList()(或 collect(Collectors.toList()))来实现枚举到DTO列表的转换。
转换的核心思想是:
以下是实现这一转换的完整代码示例:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors; // 适用于Java 8-15,Java 16+可直接使用 .toList()
public class EnumToListConverter {
public static void main(String[] args) {
// 1. 获取所有枚举实例的流
// ProductActions.values() 返回一个包含所有枚举常量的数组
// Arrays.stream() 将数组转换为流
List<ProductActionItem> actionItems = Arrays.stream(ProductActions.values())
// 2. 映射每个枚举实例到 ProductActionItem 对象
// 对于流中的每个 ProductActions 枚举实例 (actionEnum)
// 创建一个新的 ProductActionItem
// 使用 actionEnum.name() 获取枚举常量名
// 使用 actionEnum.label (或 actionEnum.getLabel()) 获取自定义标签
.map(actionEnum -> new ProductActionItem(actionEnum.name(), actionEnum.label))
// 3. 将映射后的对象收集到 List 中
// 对于Java 16及更高版本,可以直接使用 .toList()
.toList();
// 对于Java 8-15,应使用 .collect(Collectors.toList())
// .collect(Collectors.toList());
// 打印转换后的列表内容
actionItems.forEach(System.out::println);
/*
* 预期输出:
* ProductActionItem{productAction='BUY', productLabel='Buy'}
* ProductActionItem{productAction='SELL', productLabel='Sell'}
* ProductActionItem{productAction='Transfer', productLabel='Transfer'}
*/
}
}name() 与自定义字段的区别: 理解 enum.name() 总是返回枚举常量的字面名称(如 BUY),而自定义字段(如 label)需要通过实例访问。这在构建DTO时非常有用,因为您可能需要内部常量名和外部显示名。
Java 版本兼容性:
DTO 的设计: 建议将 DTO 设计为不可变的,即所有字段声明为 final,并且只通过构造函数初始化,不提供 setter 方法。这可以提高线程安全性,并确保数据一致性。例如:
public final class ProductActionItem { // final 类防止继承
private final String productAction;
private final String productLabel;
public ProductActionItem(String productAction, String productLabel) {
this.productAction = productAction;
this.productLabel = productLabel;
}
// 只有getter方法
public String getProductAction() { return productAction; }
public String getProductLabel() { return productLabel; }
// ... toString(), equals(), hashCode()
}可读性与维护性: 使用Stream API进行转换,代码简洁、意图明确,大大提高了可读性和维护性,是现代Java开发的推荐实践。
通过本教程,我们学习了如何高效且优雅地将Java枚举类型(包含自定义标签)转换为一个自定义的DTO列表。利用Java Stream API的 Arrays.stream()、map() 和 toList()(或 collect(Collectors.toList()))方法,我们可以轻松地实现这种常见的数据转换需求。这种模式在构建RESTful API、数据展示层或任何需要将枚举数据转换为更通用结构的应用中都非常实用。掌握这种转换技巧,将有助于您编写更简洁、更具可读性和更现代的Java代码。
以上就是Java枚举转换:将枚举名称与自定义标签映射到列表对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号