Fel表示式計算引擎
阿新 • • 發佈:2018-11-19
一、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); } }