您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何理解在項目中使用到的MVEL,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
簡單來說是一種強(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ù),這就????了。那么我們工作中用這東西來干嘛?
數(shù)據(jù)流轉(zhuǎn)就是不同對象間數(shù)據(jù)的轉(zhuǎn)換。比如a對象數(shù)據(jù)通過某些規(guī)則轉(zhuǎn)化為b對象數(shù)據(jù)。ca,這說的是不是數(shù)據(jù)清洗???。對,說的沒錯,但是數(shù)據(jù)清洗只是其中的一個具體項罷了。????,來個圖:
由圖可以看出兩個對象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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(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)容。