Java Optional映射流水线中Enum枚举valueOf合法性校验实现方法
结论
- 你最初设想的
filter(result -> ProductType.valueOf(result) != null)逻辑无法生效:Enum.valueOf()方法在找不到对应枚举常量时会直接抛出IllegalArgumentException,不会返回null,所以无法通过判断返回值完成过滤。 - 你找到的
EnumUtils.isValidEnum完全可以直接在Optional链式调用中使用,你写的filter(x -> EnumUtils.isValidEnum(ProductType.class, x))写法是可行的,该方法不会抛出异常,仅通过布尔值返回校验结果,刚好匹配你的需求。
调整后的完整代码
public static ProductType getExportProductType(ExportProductType exportProductType) { return Optional.ofNullable(exportProductType) .map(ExportProductType::name) // 先校验枚举名称是否存在,不存在则过滤为empty .filter(name -> EnumUtils.isValidEnum(ProductType.class, name)) .map(ProductType::valueOf) // 无论是入参为空、枚举名称不存在,都会走到这里抛自定义异常 .orElseThrow(() -> new ProductTypeNotFoundException()); }
无依赖替代方案
如果不想引入Apache Commons Lang的EnumUtils依赖,也可以自己实现校验逻辑放到filter中,效果完全一致:
.filter(name -> Arrays.stream(ProductType.values()).anyMatch(e -> e.name().equals(name)))
内容的提问来源于stack exchange,提问作者user16409822
相关产品推荐
相关产品推荐

