Java Stream实现枚举匹配:替换内部for循环并抛出异常
没问题,咱们把这个内部的for循环换成Stream操作其实非常直观,核心就是用Stream替代手动遍历数组的逻辑,同时还能更简洁地处理“无匹配则抛异常”的需求。先给你整理好完整的重构代码,再拆解关键部分:
重构后的枚举实现
首先先修正原枚举里的小语法问题(比如cat2后面多了个逗号,还有成员变量的位置要放在枚举常量之后),然后用Stream重构byVal方法:
import java.util.Arrays; import java.util.NoSuchElementException; public enum Person { cat1("abc"), cat2("def", "gh1"); private final String[] dummy; // 建议用final修饰,保证枚举字段不可变 Person(String... dummy) { this.dummy = dummy; } public static Person byVal(String val) { return Arrays.stream(Person.values()) // 替换原for循环:把dummy数组转成Stream,判断是否有匹配的元素 .filter(person -> Arrays.stream(person.dummy).anyMatch(val::equals)) .findFirst() // 无匹配时直接抛出异常,替代手动判断null的逻辑 .orElseThrow(() -> new NoSuchElementException("No Person found for value: " + val)); } }
关键逻辑说明
- 枚举转Stream:用
Arrays.stream(Person.values())把所有枚举值转换成Stream(Java 9及以上可以直接用Person.stream(),枚举类自带了这个静态方法) - 替换内部for循环:在
filter中,把每个枚举的dummy数组转成Stream,调用anyMatch(val::equals)——这个方法会遍历数组元素,只要有任意一个元素和传入的val相等,就会返回true,刚好替代你原来的内部for循环判断逻辑 - 处理无匹配场景:用
findFirst()获取第一个匹配的枚举,然后链式调用orElseThrow(),在没有找到匹配项时直接抛出指定异常,比手动判断返回值再抛异常更简洁
如果你的匹配需求需要忽略大小写,可以把val::equals改成s -> s.equalsIgnoreCase(val),根据实际业务调整即可。
内容的提问来源于stack exchange,提问作者Novice User
相关产品推荐
相关产品推荐

