溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解在項目中使用到的MVEL

發(fā)布時間:2021-11-09 17:56:19 來源:億速云 閱讀:143 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹如何理解在項目中使用到的MVEL,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1.MVEL是啥?它能做啥?

簡單來說是一種強(qiáng)大的表達(dá)式解析器。我們可以自己寫一些表達(dá)式,交給mvel進(jìn)行解析計算,得到這個表達(dá)式計算的值。玩概念,我不懂,????

還是舉個例子靠譜。????
比如我們要進(jìn)行一個加法運(yùn)算。在java中我們這樣寫:

int res = 1+1;  // 2

若我用mvel則這樣寫:

Object res = MVEL.eval("1+1");  //2

是不是很吃驚?????!?+1”就是一個表達(dá)式,第一種我們是硬編碼實(shí)現(xiàn)的計算結(jié)果,但是第二種方案,直接給evel函數(shù)傳遞一個表達(dá)式字符串,直接能計算出結(jié)果。這樣如果想計算1-1。直接傳人不同的表達(dá)式即可?,F(xiàn)在要計算'(2+2)*3+5/2'或'2>1?1+1:2+2'。來吧你硬編碼試試這些計算?是不是又要多寫幾行代碼,而且不便擴(kuò)展。

你以為mvel只能做這些了?那就真的是太年輕了。目前mvel支持大量的語法,條件,循環(huán)等。還可以支持自定義函數(shù),這就????了。那么我們工作中用這東西來干嘛?

2.在自定義數(shù)據(jù)流轉(zhuǎn)中的使用

① 啥是數(shù)據(jù)流轉(zhuǎn)

數(shù)據(jù)流轉(zhuǎn)就是不同對象間數(shù)據(jù)的轉(zhuǎn)換。比如a對象數(shù)據(jù)通過某些規(guī)則轉(zhuǎn)化為b對象數(shù)據(jù)。ca,這說的是不是數(shù)據(jù)清洗???。對,說的沒錯,但是數(shù)據(jù)清洗只是其中的一個具體項罷了。????,來個圖:
如何理解在項目中使用到的MVEL

由圖可以看出兩個對象name和age都是一對一映射,但是目標(biāo)對象不需要sex字段,但是多了一個出生年的字段,而且是通過年齡計算而來。下面我們就以代碼來模擬一下這個轉(zhuǎn)換過程,在這里我對象都用map來定義。

HashMap<Object, Object> srcMap = Maps.newHashMap();
srcMap.put("name","zs");
srcMap.put("age",10);
srcMap.put("sex","女");
//字段映射關(guān)系
HashMap<String, String> mapping = Maps.newHashMap();
mapping.put("name","name");
mapping.put("age","age");
//這里先把當(dāng)前年份寫死為2019
mapping.put("birthYear","2019-age");
//目標(biāo)對象
HashMap<Object, Object> targetMap = Maps.newHashMap();
//k為目標(biāo)表字段,v為轉(zhuǎn)換規(guī)則
mapping.forEach((k,v)->{
    Object reValue = MVEL.eval(v,srcMap);
    targetMap.put(k,reValue);
});
System.out.println("源對象"+srcMap);    //源對象{sex=女, name=zs, age=10}
System.out.println("目標(biāo)對象"+targetMap);   //目標(biāo)對象{birthYear=2009, name=zs, age=10}

對就這么簡單,但是我們這里計算出生年份中的當(dāng)前年份寫死了啊。明細(xì)不不是我們想要的,沒事我們慢慢來。

.自定義函數(shù)

定義獲取當(dāng)前年份函數(shù)

/**
 * 獲取當(dāng)前年份方法
 * @return
 */
public static Object getCurrentYear(){
    Calendar date = Calendar.getInstance();
    String year = String.valueOf(date.get(Calendar.YEAR));
    return year;
}

.將自定義函數(shù)注冊

直接上代碼

static ParserContext context = new ParserContext();
static {
    //MvelTest是getCurrentYear函數(shù)的類
    Method[] declaredMethods = MvelTest.class.getDeclaredMethods();
    for(Method method : declaredMethods){
        context.addImport(method.getName(),method);
    }
}

.使用

直接將Object reValue = MVEL.eval(v,srcMap);替換為

Object reValue = MVEL.executeExpression(MVEL.compileExpression(v, context),srcMap);

即可。compileExpression的作用就是將我們的規(guī)則進(jìn)行編譯成mvel可以識別的一個過程

birthYear規(guī)則替換為mapping.put("birthYear","getCurrentYear()-age");執(zhí)行得到相同的結(jié)果。

有了這些我們可以自定義更多的轉(zhuǎn)換規(guī)則,還可以借此開發(fā)一套用戶配置工具,根據(jù)用戶自己的配置,進(jìn)行相應(yīng)的資源映射。得到想要的目標(biāo)數(shù)據(jù)。

關(guān)于如何理解在項目中使用到的MVEL就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI