Fel表达式计算引擎

一、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 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);

    }

}



 

你可能感兴趣的:(Java)