使用JEXL解析表达式

前言

  这几天公司做的业务用到了动态拼接数字和字符串的混合运算,多个计算表达式之间的与或运算。 
自己手动解析拼接好的计算表达式有些麻烦,我就网上找资料,看有没有自动解析计算表达式的方法, 
自己找到了很多方法,最后使用JEXL来解析计算表达式,JEXL遵循apache的开源规则,这样用起来
就非常的方便, 现在就记录下自己是如何使用的。

开始码代码

引入maven依赖

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-jexl -->
<!--jexl解析表达式-->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-jexl3</artifactId>
  <version>3.1</version>
</dependency>

直接上自己写的测试代码

package com.cgp.expression.util;

import org.apache.commons.jexl3.JexlContext;
import org.apache.commons.jexl3.JexlExpression;
import org.apache.commons.jexl3.MapContext;
import org.apache.commons.jexl3.internal.Engine;
import java.util.HashMap;
import java.util.Map;

public class ExpressionUtil {

    /**
     * 根据表达式和参数参数集合进行表达式的计算
     * @param eval
     * @param map
     * @return
     */
    private static Object executeExpression(String eval, Map<String, Object> map) {
        JexlExpression expression = new Engine().createExpression(eval);
        JexlContext context = new  MapContext(map);
        Object result = expression.evaluate(context);
        return result;
    }

    /**
     * 表达式解析并返回Boolean类型的计算结果
     * @param eval
     * @param map
     * @return
     */
    public static Boolean executeExpressionResult(String eval, Map<String, Object> map) {
        Object object = executeExpression(eval, map);
        return Boolean.valueOf(object.toString());
    }

    public static void main(String[] args) {
        String eval = "a>10 && b<100";
        Map<String, Object> map = new HashMap<>();
        map.put("a", 6);
        map.put("b", 6);
        Boolean result = executeExpressionResult(eval, map);
        System.out.println(result);
    }
}

运行结果

代码运行结果
从上面的运行结果可以看出,JEXL支持数值之间的运算,也支持位与运算,功能可以说是比较强大了

可以解析true和false关键字

    public static void main(String[] args) {
        String eval = "true && b<100";
        Map<String, Object> map = new HashMap<>();
        map.put("b", 6);
        Boolean result = executeExpressionResult(eval, map);
        System.out.println(result);
    }

运行结果

运行结果
可以看出,JEXL可以解析true或者false这种位与运算的关键字,这样对于某些特定场合的解析就会非常方便了。

总结

JEXL支持解析数值计算,位与运算,以及true和false这种关键字的解析,功能非常强大,以后业务里面用到解析表达式可以用JEXL来解析,开发效率会提高很多。

实现公式表达式的计算通常可以使用Java中的表达式解析器,比如使用JEXLJavaluator库来实现。 以下是一个使用Javaluator库实现的示例代码,可以计算包含变量和函数的表达式: ```java import java.util.HashMap; import java.util.Map; import net.astesana.javaluator.DoubleEvaluator; import net.astesana.javaluator.StaticVariableSet; public class SalaryCalculator { public static void main(String[] args) { // 创建一个表达式解析器 DoubleEvaluator evaluator = new DoubleEvaluator(); // 定义变量 Map<String, Double> variables = new HashMap<>(); variables.put("baseSalary", 5000.0); variables.put("bonus", 1000.0); // 定义函数 evaluator.addFunction("tax", 1, (argsList) -> { double income = (double) argsList.get(0); return income * 0.1; // 税率为10% }); // 计算表达式 String expression = "baseSalary + bonus - tax(baseSalary + bonus)"; double result = evaluator.evaluate(expression, new StaticVariableSet<>(variables)); System.out.println("工资为:" + result); } } ``` 在上述代码中,我们首先创建了一个`DoubleEvaluator`对象。然后定义了变量`baseSalary`和`bonus`,并将它们添加到变量映射表中。接着,我们添加了一个名为`tax`的函数,它接受一个参数,表示收入金额,返回税额。最后,我们调用`evaluate`方法计算表达式,并将变量映射表传递给它。最终,我们将计算结果打印出来。 您可以根据实际需求修改变量和函数的定义,以实现自定义的工资项目计算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值