1. 程式人生 > >Fel表示式計算引擎

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

    }

}