0
点赞
收藏
分享

微信扫一扫

java中使用 commons-jexl3 和 jsel 的实例


标题中提到的这两个都是表达式引擎。
据我个人的感觉和理解差不多是同样的东西,但究竟谁好谁差,好在哪差在哪我也不清楚。
不过我都亲测成功了,基本的还是可用的。
这样的库,可以用来实现一些规则非常复杂的功能。

好比公司里有很多的销售,销售每个月要卖出各种课程内容,有的全价售出,有的打了折扣,有的退费了,有的部分退费了,有的顺利开课,有的费了很大成本才完成了一单,有的利润高,有的利润低,有的用了优惠券,有的没有……
最终,每个月要根据多种指标计算销售的业绩。
如:可能同时生效的有这些规则:

  • 月销售额在2W以下的,只有基本工资;2-3W的,2W以上部分1.5倍提成;3W以上的,2倍提成。
  • 当月退费的,业绩扣减;下月或以后退费的,在退费的月份里扣减业绩
  • 使用了优惠券的订单,计算业绩的数值为 未使用优惠券的金额 + 优惠券的金额的一半
  • 9折以上售出的课程,满额计算业绩;9折以下的课程,计算业绩的数值为折后金额
  • ……

总之,因业务而不同,规则可能非常复杂且多变,多种组合,甚至自己需要配置多种表达式。
类似 ​​​var monthlyMoney = a + 0.8 * b + 0.65 c + ....... //其中有很复杂的业务和变量​​ 这时候使用表达式引擎就非常合适了。

以下是我自己的一个小demo,亲测有效,是一个简单的maven控制台项目。
上一部分关键代码。

maven依赖

<dependencies>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.3</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl3</artifactId>
<version>3.1</version>
</dependency>

<dependency>
<groupId>org.xidea</groupId>
<artifactId>jsel</artifactId>
<version>0.1.0</version>
</dependency>
</dependencies>

代码:
​​​Main方法​

package com.codejam.el.console;

import com.codejam.el.console.jexl.JexlTest;
import com.codejam.el.console.jsel.JselTest;

public class ElStarter {

public static void main(String[] args) {

System.out.println("El console start up done.");

//JselTest.Test1();

JexlTest.Test1();


System.out.println("El console start up done.==============");
}
}

​Jexl3 库​​ 即依赖:

 <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl3</artifactId>
<version>3.1</version>
</dependency>

package com.codejam.el.console.jexl;

import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlContext;
import org.apache.commons.jexl3.JexlExpression;
import org.apache.commons.jexl3.MapContext;

public class JexlTest {

public static void Test1() {
JexlContext jexlContext = new MapContext();

jexlContext.set("var1", 1);
jexlContext.set("var2", 2);

JexlBuilder builder = new JexlBuilder();
JexlExpression expression = builder.create().createExpression("var1 + 2 * var2");

Object evaluate = expression.evaluate(jexlContext);


System.out.println("evaluate " + evaluate.toString());

}
}

​Jsel 库​​ 即依赖:

 <dependency>
<groupId>org.xidea</groupId>
<artifactId>jsel</artifactId>
<version>0.1.0</version>
</dependency>

package com.codejam.el.console.jsel;

import org.xidea.el.Expression;
import org.xidea.el.impl.ExpressionImpl;

import java.util.HashMap;

public class JselTest {

public static void Test1(){

Expression el = new ExpressionImpl("var1 + 2 * var2");
HashMap context = new HashMap();

context.put("var1",111);
context.put("var2",2);

Object evaluate = el.evaluate(context);

System.out.println("evaluate = " + evaluate.toString());

System.out.println("var1 = " + context.get("var1"));
System.out.println("var2 = " + context.get("var2"));


context.put("var2",3);

System.out.println("var1 = " + context.get("var1"));
System.out.println("var2 = " + context.get("var2"));

System.out.println("evaluate2 = " + el.evaluate(context).toString());
}
}

最后,上demo地址,亲测成功@2021年3月16日00点00分。

​​https://gitee.com/festone/java-el-demo​​


举报

相关推荐

0 条评论