天天看點

Java實作表達式解析--初始篇

1、首先,需要一個expression.jar。

注意,這個jar包并不是javax.el.expression之類的等等,我反正是在maven網上資源中沒有搜尋到,個人之前網頁下載下傳了一個jar包,結構如下,我會将其上傳到個人資源中,有需要的朋友可以自行下載下傳。

Java實作表達式解析--初始篇

為什麼必須要這個jar包,因為不同的表達式解析jar包自己有不同的方法,本文講述的即是這個jar包的使用。

2、建立一個自己的工程

步驟略。

3、解析過程介紹

表達式解析的目的:當然是為了通用了。一個項目設計到的一些計算公式如果寫死的話可擴充性就會随之大大降低,可能公式的改動和資料格式的變動都會影響到整個項目,開發人員再去底層修改對應的公式就會很麻煩(畢竟最初開發人員不可能一直跟着項目)。是以為了避免後期改動代碼,對于有計算公式的項目最後設計成可配置型的。可配置包括界面配置和配置檔案(….扯遠了,跳過)。

表達式解析的結果:當然是計算表達式了- -,就像普通的a+b;表達式一樣,在給a,b指派後傳回的就是結果值了,當然也有boolean型的表達式,如1==0;、2>1;等等。

表達式解析具體函數:

表達式對象執行個體化:

ExpressionFactory factory = ExpressionFactory.getInstance();
        Expression expression = factory.getExpression(expr);//expr為表達式
           
表達式執行:
           
Valuable valuable = expression.evaluate();
        System.out.println(valuable.getValue().toString());
           

以上隻是一個小小的demo,實際使用的時候表達式肯定會複雜的多,表達式中也不僅僅是值與值的計算,也會存在着些許變量,也會有一些函數。對于變量的擷取和指派如下:

ExpressionFactory factory = ExpressionFactory.getInstance();
Expression expr = factory.getExpression(expression);
Set<String> fieldSet = expr.getVariableNames();
for (String fieldName : fieldSet) {
    //如果該變量還沒有被指派
   if (null == expr.getVariableValue(fieldName)) {
       String fvalue="1111";//可以在此處擷取變量值進行賦予
       expr.setVariableValue(fieldName, fvalue);
    }
}
           

4、簡單的測試案例

import java.util.Set;

import neu.sxc.expression.Expression;
import neu.sxc.expression.ExpressionFactory;
import neu.sxc.expression.tokens.Valuable;

public class Test1 {
    public static void main(String[] args) {
        ExpressionFactory factory = ExpressionFactory.getInstance();
        Expression expr = factory.getExpression("a+b+c+d;");
        Set<String> fieldSet = expr.getVariableNames();
        for (String fieldName : fieldSet) {
            if (null == expr.getVariableValue(fieldName)) {
                int fvalue = ;
                expr.setVariableValue(fieldName, fvalue);
            }
        }
        Valuable valuable = expr.evaluate();
        System.out.println(valuable.getValue().toString());
    }
}
           

輸出結果為:8。

需要注意的幾點:

1)表達式要以分号(;)結尾

2)變量的指派要對應,比如要進行算數運算,要賦予變量算術類型的值,要進行字元串運算,要賦予變量字元型的值。否則會出錯。

以上隻是關于Java表達式的基礎之基礎,後續我會針對表達式如何配置以及表達式中的函數(系統自帶函數和自定義函數)進行詳細的講解。