最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
怎样使用枚举过滤字符串列表
时间:2026-06-18 08:27:47 编辑:袖梨 来源:一聚教程网
本文介绍两种高效方式——传统循环和 java stream api——根据枚举定义的合法值,筛选原始字符串列表中匹配的元素,并返回符合枚举类型的子集。
本文介绍两种高效方式——传统循环和 java stream api——根据枚举定义的合法值,筛选原始字符串列表中匹配的元素,并返回符合枚举类型的子集。
在实际开发中,常需将用户输入或配置项(如字符串列表)与预定义的业务类型(如枚举)对齐,确保数据合法性。例如,给定一个材料类型列表 ["window", "door", "room", "kitchen", "bedroom"] 和仅允许 "window"、"door" 的枚举 Type,目标是提取出所有与枚举值精确匹配的字符串。
首先,需修正原始代码中的语法与命名问题:Java 枚举类应使用 enum 关键字,且建议遵循标准命名规范(如 Type 类名首字母大写,枚举常量全大写)。以下是修正后的枚举定义:
public enum Type { WIN("window"), DOOR("door"); private final String type; Type(String type) { this.type = type; } public String getType() { return type; }}
✅ 方式一:传统 for 循环(清晰易读,兼容性好)
适用于对性能敏感或需兼容低版本 JDK 的场景:
List<String> matType = Arrays.asList("window", "door", "room", "kitchen", "bedroom");List<String> matchingTypes = new ArrayList<>();for (String candidate : matType) { for (Type type : Type.values()) { if (type.getType().equals(candidate)) { matchingTypes.add(candidate); break; // 找到即退出内层循环,提升效率 } }}// 结果:["window", "door"]
✅ 方式二:Stream API(函数式风格,简洁高效)
推荐用于 JDK 8+,代码更紧凑且可读性强:
List<String> matchingTypes = Arrays.stream(Type.values()) .map(Type::getType) // 提取每个枚举对应的字符串值 .filter(matType::contains) // 保留存在于原始列表中的项 .collect(Collectors.toList());
⚠️ 注意事项:
- 枚举字段 type 应声明为 final,避免意外修改;
- 若 matType 数据量极大而枚举项极少,建议将 Type.values() 转为 Set<String> 提升 contains 查询复杂度至 O(1):
Set<String> validTypes = Arrays.stream(Type.values()) .map(Type::getType) .collect(Collectors.toSet());List<String> matchingTypes = matType.stream() .filter(validTypes::contains) .collect(Collectors.toList());
- 注意 String.equals() 的空安全:若 matType 可能含 null,需额外判空;枚举 getType() 不会返回 null(构造时已保证),故无需校验。
综上,Stream 方案更符合现代 Java 实践,而优化后的 Set 查找在大数据量下更具扩展性。选择方案时应兼顾可读性、性能需求与工程约束。
相关文章
- 王者荣耀世界零氪玩家如何生存 07-28
- 快手极速版怎么绑定手机号 07-28
- 明日方舟和轻松小熊联动活动内容一览 07-28
- 逆战未来黎明之光 逆战未来黎明之光玩法机制与新手入门指南 07-28
- 植物大战僵尸融合版毁灭土豆地雷介绍 07-28
- 逆战未来飓风之龙 逆战未来飓风之龙武器获取方法详解 07-28