一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

怎样使用枚举过滤字符串列表

时间: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 查找在大数据量下更具扩展性。选择方案时应兼顾可读性、性能需求与工程约束。

热门栏目