You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用Map或switch case匹配字符串列表与枚举字符串值

Java 枚举匹配实现方案

核心实现思路

  • 每个枚举实例内部存储自身对应的匹配字符串集合
  • 匹配时直接遍历所有枚举实例,按定义顺序校验匹配规则,返回第一个命中的枚举值
  • 全程不使用Map、switch case,仅依赖枚举自身参数实现

完整代码实现

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public enum Rara{
  MA_ON("MO"),
  MA_MAN("MG", "PH"),
  MA_IP("MG", "PH", "IC"),
  BAR("RC");

  // 存储当前枚举对应的所有匹配字符串
  private final Set<String> matchKeys;

  // 构造方法:将传入的字符串参数存入集合
  Rara(String... s){
       this.matchKeys = new HashSet<>(Arrays.asList(s));
       // 若不想用HashSet,可替换为List存储:this.matchKeys = Arrays.asList(s);
  }

  /**
   * 根据传入的Val列表匹配对应的枚举值
   * 匹配规则可根据业务需求调整,当前默认规则为输入包含任意一个枚举匹配键即命中
   */
  public static Rara getValue(List<Val> v){
        // 先将入参的Val列表转换为字符串集合,此处假设Val类有getValue()方法返回标签内的文本值,可根据实际类结构修改取值逻辑
        Set<String> inputValues = v.stream()
                .map(Val::getValue)
                .collect(Collectors.toSet());

        // 遍历所有枚举实例,返回第一个匹配的
        for (Rara rara : Rara.values()) {
            // 规则1:输入集合与枚举匹配键存在交集即命中,符合你给出的示例场景
            for (String key : rara.matchKeys) {
                if (inputValues.contains(key)) {
                    return rara;
                }
            }
            // 可选规则2:枚举的所有匹配键都存在于输入集合中才命中,需时直接替换上面的循环即可
            // if (inputValues.containsAll(rara.matchKeys)) {
            //     return rara;
            // }
        }
        // 无匹配项时可返回null或抛自定义业务异常
        return null;
  }
}

适配说明

你给出的示例场景下,输入包含PH时会命中MA_MAN,输入包含MO时会命中MA_ON,完全符合需求。如果对匹配精度有更高要求,只需修改枚举遍历阶段的判断逻辑即可。

内容的提问来源于stack exchange,提问作者fatherazrael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:45:09