Java中将比较运算符字符串转换为实际可用运算符的实现方法
实现方案说明
Java 本身不支持直接把枚举里存储的运算符字符串解析成原生比较运算符。
Java是静态编译型语言,>、>=这类运算符的语义是在编译阶段就固定绑定的,运行时没有动态解析字符串转原生运算符的能力。如果非要走字符串解析的路子,只能引入脚本引擎动态执行拼接的比较表达式,不仅性能差,还要处理各种类型转换、异常捕获的问题,生产环境完全不推荐用。
最合理的实现方式是直接调整枚举定义,给每个枚举项绑定对应的比较逻辑,不需要做任何字符串解析,代码可读性、可维护性都更好,性能也和原生写法一致。
具体实现代码
第一步:改造枚举类,绑定比较逻辑
用JDK自带的函数式接口BiPredicate存储每个运算符对应的判断逻辑,同时保留原有的运算符字符串字段,满足前端展示、序列化等场景的需求:
import java.util.function.BiPredicate; public enum Comparator { EQ("=", (a, b) -> Double.compare(a, b) == 0), GTE(">=", (a, b) -> a >= b), GT(">", (a, b) -> a > b), LT("<", (a, b) -> a < b), LTE("<=", (a, b) -> a <= b); private final String symbol; private final BiPredicate<Double, Double> matchRule; Comparator(String symbol, BiPredicate<Double, Double> matchRule) { this.symbol = symbol; this.matchRule = matchRule; } public String getSymbol() { return symbol; } // 枚举内部封装比较方法,外部直接调用即可 public boolean test(double left, double right) { return matchRule.test(left, right); } }
第二步:实现比较方法
你需要的conditionPassed方法只需要直接调用枚举封装的比较逻辑即可,代码非常简洁:
private boolean conditionPassed(double var1, double var2, Comparator comp) { if (comp == null) { throw new IllegalArgumentException("比较运算符枚举不能为null"); } return comp.test(var1, var2); }
注意事项
浮点数存在天然的精度误差,如果你的业务场景对精度敏感(比如金额、精确计量场景),不要直接用原生比较运算符,建议根据业务要求的精度阈值调整判断逻辑,比如相等判断可以改成如下写法规避精度问题:
// 差值小于1e-6即判定为相等,可根据业务调整精度阈值 EQ("=", (a, b) -> Math.abs(a - b) < 0.000001)
内容的提问来源于stack exchange,提问作者wonderv
相关产品推荐
相关产品推荐

