Java函数式处理空参数:如何重构解析100/100格式字符串返回Integer对的方法
函数式风格Java代码重构方案
重构思路
- 用
Optional的声明式链式操作替代分支判断、三目运算符等命令式空值/条件处理逻辑,避免显式的状态判断 - 优化正则表达式,移除不必要的捕获分组,减少额外的资源开销
- 把匹配、校验、解析的逻辑拆分为独立的链式节点,可读性更强,后续调整逻辑时只需要修改对应节点即可
重构后基础版本代码
import java.util.Optional; import java.util.regex.Pattern; // 如果你用的是自定义Pair实现,替换成对应的类导入即可 import javafx.util.Pair; private static final Pattern PATTERN = Pattern.compile("^(\\d+)/(\\d+)$"); public static Optional<Pair<Integer, Integer>> foo(String str) { return Optional.ofNullable(str) // 非空字符串才生成Matcher .map(PATTERN::matcher) // 校验匹配结果和分组数 .filter(matcher -> matcher.matches() && matcher.groupCount() == 2) // 匹配成功才解析为Pair对象 .map(matcher -> new Pair<>( Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)) )); }
关键改动说明
- 空值处理优化:原来的
str != null ? str : ""替换为Optional.ofNullable(str),空值会直接在链式操作中传递到最后返回Optional.empty(),不需要显式写空值判断分支 - 正则精简:将原来的
^(\d+)(/)(\d+)$中不需要捕获的/分组移除,分组数从3降为2,减少不必要的捕获开销,校验逻辑也更简洁 - 逻辑结构优化:原来的三目运算拆分为
filter节点做匹配校验,匹配失败直接返回空,匹配成功才进入后续的map做解析转换,全链路都是声明式写法,没有显式的分支跳转 - 编码规范优化:静态常量
pattern改名为符合Java编码规范的大写下划线格式PATTERN
增强健壮性的进阶版本
如果需要兼容正则匹配到的数字超出int范围的场景,避免Integer.parseInt抛出异常,可以封装安全解析方法,结合flatMap实现全链路无异常:
import java.util.Optional; import java.util.regex.Pattern; import javafx.util.Pair; private static final Pattern PATTERN = Pattern.compile("^(\\d+)/(\\d+)$"); private static Optional<Integer> safeParseInt(String s) { try { return Optional.of(Integer.parseInt(s)); } catch (NumberFormatException e) { return Optional.empty(); } } public static Optional<Pair<Integer, Integer>> foo(String str) { return Optional.ofNullable(str) .map(PATTERN::matcher) .filter(matcher -> matcher.matches() && matcher.groupCount() == 2) .flatMap(matcher -> safeParseInt(matcher.group(1)) .flatMap(first -> safeParseInt(matcher.group(2)) .map(second -> new Pair<>(first, second)))); }
内容的提问来源于stack exchange,提问作者user9304291
相关产品推荐
相关产品推荐

