Skip to content

5.EL表达式解析模式

wycst edited this page Nov 16, 2024 · 1 revision

数据准备

public class ElFact {

    public int a = 1;
    public int b = 2;
    public int c = 3;
}

static Map map = new HashMap();
static ElFact fact = new ElFact();

static {
    map.put("a", 100);
    map.put("b", 200);
    map.put("c", 300);
    map.put("string", "hello");
    map.put("bd", new BigDecimal("123.456789"));
    map.put("self", map);
    map.put("fact", fact);
}

解析案例

// 1.静态数学表达式计算
System.out.println(Expression.eval("1+1"));  // 2

// 2.变量表达式计算
System.out.println(Expression.eval("a+b+c", map));  // 使用map作为上下文 600
System.out.println(Expression.eval("a+b+c", fact));  // 使用pojo作为上下文 6
System.out.println(Expression.evalParameters("a+b+b+c", 1, 2, 3));  // 输出8(a=1, b = 2, c = 3) 使用可变参数作为上下文按参数解析顺序获取

// 3.将计算的结果类型转为目标类型
int result = Expression.evalResult("1+1", int.class);
System.out.println("result: " + result);

// 4.字符串(支持函数)
System.out.println(Expression.eval("1+string", map));  // 1hello
System.out.println(Expression.evalParameters("str.length() + 6", "abcdefgh"));  // 14
System.out.println(Expression.evalParameters("str.length() + 6 + str", "abcdefgh"));  // 14abcdefgh
System.out.println(Expression.evalParameters("str.contains('cde') ? 1 : 2", "abcdefgh"));  // 1
System.out.println(Expression.evalParameters("str.indexOf('cde')", "abcdefgh"));  // 2

// 5.指数运算(使用**)
System.out.println(Expression.eval("6**2"));  // 36

// 6.常规四则运算
System.out.println(Expression.evalResult("1+2.5-3.777 * 45.6 / (31.0 / 6 + (5 >> 2))", double.class) == (1 + 2.5 - 3.777 * 45.6 / (31.0 / 6 + (5 >> 2))));

// 7.内置函数(max/min/sum/avg/abs/sqrt/lower/upper/size/ifNull/toArray)
System.out.println(Expression.eval("sum(1+max(5,7,9,11,13))")); // 14
System.out.println(Expression.eval("sum(1+min(5,7))")); // 6

// 8.精确计算(使用$作为浮点数的后缀会解析为BigDecimal),只要存在BigDecimal的运算都会转为BigDecimal
System.out.println(Expression.eval("1.2345678123232323232323$+7.45678$"));
System.out.println(Expression.eval("bd + 7", map).getClass()); //

// 9.变量支持链式访问(map和pojo兼容)
System.out.println(Expression.eval("self.self.self.self.a + self.fact.a", map)); // 100 + 1

// 10.判断是否属于/不属于(使用数学符号∈和∉)
System.out.println(Expression.eval("1 ∈ {1,2,3}")); // true
System.out.println(Expression.eval("1 ∉ {1,2,3}")); // false
// {}只支持静态数组,动态数组可以使用toArray函数支持
System.out.println(Expression.eval("100 ∈ toArray(a, b, c)", map)); // true
System.out.println(Expression.eval("100 ∉ toArray(a, b, c)", map)); // false

// 11.支持先解析生成表达式模型,然后运算
Expression expr = Expression.parse("a+b+c");
System.out.println(expr.evaluateParameters(1, 3, 5)); // a = 1 b = 3 c = 5 -> 9
System.out.println(expr.evaluate(map)); // 600
System.out.println(expr.evaluate(fact)); // 6
Clone this wiki locally