如何不使用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
相关产品推荐
相关产品推荐

