FEL表達式的用法


 Fel是開放的,引擎執行中的多個模塊都可以擴展或替換。Fel的執行主要是通過函數實現,運算符(+、-等都是Fel函數),所有這些函數都是可以替換的,擴展函數也非常簡單。

   Fel有雙引擎,同時支持解釋執行和編譯執行。可以根據性能要求選擇執行方式。編譯執行就是將表達式編譯成字節碼(生成java代碼和編譯模塊都是可以擴展和替換的)

 FEL可以進行算數運算以及邏輯運算,也可以調用類的靜態方法、非靜態方法。 

 

只需要一個jar包:

 

 1.  簡單使用

 1.  簡單計算

    private static void calculate() {
        // 算數運算
        FelEngine fel = new FelEngineImpl();
        Object result = fel.eval("1.5898*1+75");
        System.out.println(result);

        // 邏輯運算
        Object result2 = fel.eval("1 == 2 || '1'.equals('1')");
        System.out.println(result2);
    }

 結果:

76.5898
true

 

2.   變量用法

    private static void variables() {
        // 變量
        FelEngine fel = new FelEngineImpl();
        FelContext ctx = fel.getContext();
        ctx.set("單價", 1.5898);
        ctx.set("數量", 1);
        ctx.set("運費", 75);

        Object result = fel.eval("單價*數量+運費");
        System.out.println(result);
    }

結果:

76.5898

 

3.  訪問對象的方法

    private static void object() {
        FelEngine fel = new FelEngineImpl();
        FelContext ctx = fel.getContext();
        User user = new User(1, "qqq", "中國北京");
        ctx.set("user", user);

        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "qqq");

        ctx.set("map", map);

        // 調用user.getName()方法。
        System.out.println(fel.eval("user.name"));

        // map.name會調用map.get("name");
        System.out.println(fel.eval("map.name"));
    }

qqq
qqq

 

例如:訪問StringUtils方法的第一種方式

    private static void method() {
        FelEngine fel = new FelEngineImpl();
        FelContext ctx = fel.getContext();
        ctx.set("out", System.out);
        ctx.set("StringUtils", new StringUtils());

        Object eval = fel.eval("out.println('Hello Everybody'.substring(6))");
        Object eval2 = fel.eval("StringUtils.isEmpty('')");
        System.out.println(eval);
        System.out.println(eval2);
    }

 

4.  訪問靜態方法

  訪問StringUtils的方法:

    private static void staticMethod() {
        // 調用Math.min(1,2)
        Object eval = FelEngine.instance.eval("$('Math').min(1,2)");
        System.out.println(eval);

        // 調用Stringutils的方法
        Object eval1 = FelEngine.instance.eval("$('org.apache.commons.lang.StringUtils').isEmpty('123')");
        System.out.println(eval1);
    }

結果:

1
false

 

注意:如果不加包名會默認調用java.lang包下的,即使類是默認包的也會訪問java.lang包的,所以最好加包名。 

 

5.  訪問集合

    private static void collections() {
        FelEngine fel = new FelEngineImpl();
        FelContext ctx = fel.getContext();

        // 數組
        int[] intArray = { 1, 2, 3 };
        ctx.set("intArray", intArray);
        // 獲取intArray[0]
        String exp = "intArray[0]";
        System.out.println(exp + "->" + fel.eval(exp));

        // List
        List<Integer> list = Arrays.asList(1, 2, 3);
        ctx.set("list", list);
        // 獲取list.get(0)
        exp = "list[0]";
        System.out.println(exp + "->" + fel.eval(exp));

        // 集合
        Collection<String> coll = Arrays.asList("a", "b", "c");
        ctx.set("coll", coll);
        // 獲取集合最前面的元素。執行結果為"a"
        exp = "coll[0]";
        System.out.println(exp + "->" + fel.eval(exp));

        // 迭代器
        Iterator<String> iterator = coll.iterator();
        ctx.set("iterator", iterator);
        // 獲取迭代器最前面的元素。執行結果為"a"
        exp = "iterator[0]";
        System.out.println(exp + "->" + fel.eval(exp));

        // Map
        Map<String, String> m = new HashMap<String, String>();
        m.put("name", "HashMap");
        ctx.set("map", m);
        exp = "map.name";
        System.out.println(exp + "->" + fel.eval(exp));

        // 多維數組
        int[][] intArrays = { { 11, 12 }, { 21, 22 } };
        ctx.set("intArrays", intArrays);
        exp = "intArrays[0][0]";
        System.out.println(exp + "->" + fel.eval(exp));

        // 多維綜合體,支持數組、集合的任意組合。
        List<int[]> listArray = new ArrayList<int[]>();
        listArray.add(new int[] { 1, 2, 3 });
        listArray.add(new int[] { 4, 5, 6 });
        ctx.set("listArray", listArray);
        exp = "listArray[0][0]";
        System.out.println(exp + "->" + fel.eval(exp));
    }

 

2.  高級用法

1.  編譯運行

    private static void compile() {
        FelEngine fel = new FelEngineImpl();
        FelContext ctx = fel.getContext();
        ctx.set("單價", 1.5898);
        ctx.set("數量", 1);
        ctx.set("運費", 75);
        Expression exp = fel.compile("單價*數量+運費", ctx);
        Object result = exp.eval(ctx);
        System.out.println(result);
    }

結果:

76.5898

 

2.  自定義context

    private static void myContext() {
        FelContext ctx = new AbstractContext() {
            @Override
            public Object get(String arg0) {
                System.out.println(arg0);
                return "111222";
            }
        };

        FelEngine fel = new FelEngineImpl(ctx);
        Object eval = fel.eval("天氣 + 溫度");
        System.out.println(eval);
    }

結果:

天氣
溫度
111222111222

 

3.  自定義函數

    private static void newFun() {
        // 定義hello函數
        Function fun = new CommonFunction() {
            public String getName() {
                return "hello";
            }

            @Override
            public Object call(Object[] arguments) {
                Object msg = null;
                if (arguments != null && arguments.length > 0) {
                    msg = arguments[0];
                }
                return ObjectUtils.toString(msg);
            }

        };

        FelEngine e = new FelEngineImpl();
        // 添加函數到引擎中。
        e.addFun(fun);
        String exp = "hello(23, 'fel', 1)";

        // 解釋執行
        Object eval = e.eval(exp);
        System.out.println("hello " + eval);
        // 編譯執行
        Expression compile = e.compile(exp, null);
        eval = compile.eval(null);
        System.out.println("hello " + eval);
    }

結果:

hello 23
hello 23

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM