一、Fel表达式计算引擎介绍
Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。
Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。
Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成java代码和编译模块都是可以扩展和替换的)通常情况下,Fel-0.7每秒可以执行千万次表达式(不包含编译时间)。目前还没有发现开源的表达式引擎比Fel快。
二、上代码,快速上手使用
Fel表达式计算引擎很容易使用,看示例代码,学习时也不妨看看其类实现。
示例代码如下:
package com.cjh.test.Fel;
import com.greenpineyu.fel.FelEngine;
import com.greenpineyu.fel.FelEngineImpl;
import com.greenpineyu.fel.context.FelContext;
import com.greenpineyu.fel.context.MapContext;
import com.greenpineyu.fel.function.CommonFunction;
import com.greenpineyu.fel.function.Function;
import java.util.HashMap;
import java.util.Map;
/**
* Fel表达式引擎测试
* @author chen jia hao
*/
public class FelTest {
public static void main(String[] args) {
test1();
}
/**
* 表达式计算
*/
public static void test1(){
FelEngine fel = new FelEngineImpl();
FelContext ctx = fel.getContext();
ctx.set("a", 1);
ctx.set("b", 2);
ctx.set("c", 3);
Object result = fel.eval("a*b+c >0 && a<b");
System.out.println(result);
}
/**
* 访问对象属性,(同时指定特定上下文)
*/
public static void test2(){
FelEngine felEngine = new FelEngineImpl();
Map<String, Object> params = new HashMap<>();
params.put("name","陈嘉豪");
FelContext mapContext = new MapContext();
mapContext.set("obj",params);
Object result = felEngine.eval("obj.name",mapContext);
System.out.println(result);
}
/**
* 调用静态方法
* 格式:"$('class').method(var0,var1..,varn)"
* class:类的全路径
*/
public static void test3(){
Object eval = FelEngine.instance.eval("$('Math').min(1,2)");
System.out.println(eval);
}
/**
* 自定义函数
*/
public static void test4(){
Function function = new CommonFunction() {
/**
* 设置函数名称
* @return
*/
@Override
public String getName() {
return "isEmpty";
}
/**
* 方法体
* @param objects
* @return
*/
@Override
public Object call(Object[] objects) {
if(objects==null || objects.length<1){
return true;
}
Object object = objects[0];
if(object==null){
return true;
}
return false;
}
};
FelEngineImpl felEngine = new FelEngineImpl();
//添加自定义函数
felEngine.addFun(function);
felEngine.getContext().set("name","chenjiahao");
Object eval = felEngine.eval("isEmpty(name)");
System.out.println(eval);
eval = felEngine.eval("isEmpty(age)");
System.out.println(eval);
}
}