表达式引擎封装-ExpressionUtil

表达式引擎封装-ExpressionUtil

介绍

与模板引擎类似,Hutool针对较为流行的表达式计算引擎封装为门面模式,提供统一的API,去除差异。 现有的引擎实现有:

使用

首先引入我们需要的模板引擎,引入后,Hutool借助SPI机制可自动识别使用,我们以Aviator为例:

<dependency>
	<groupId>com.googlecode.aviator</groupId>
	<artifactId>aviator</artifactId>
	<version>5.2.7</version>
</dependency>

执行表达式

final Dict dict = Dict.create()
		.set("a", 100.3)
		.set("b", 45)
		.set("c", -199.100);

// -143.8
final Object eval = ExpressionUtil.eval("a-(b-c)", dict);

自定义引擎执行

如果项目中引入多个引擎,我们想选择某个引擎执行,则可以:

ExpressionEngine engine = new JexlEngine();

final Dict dict = Dict.create()
		.set("a", 100.3)
		.set("b", 45)
		.set("c", -199.100);

// -143.8
final Object eval = engine.eval("a-(b-c)", dict);

创建自定义引擎

引擎的核心就是实现ExpressionEngine接口,此接口只有一个方法:eval

我们实现此接口后,在项目的META-INF/services/下创建spi文件cn.hutool.extra.expression.ExpressionEngine

com.yourProject.XXXXEngine

这样就可以直接调用ExpressionUtil.eval执行表达式了。