您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何理解在項目中使用到的MVEL,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
簡單來說是一種強大的表達式解析器。我們可以自己寫一些表達式,交給mvel進行解析計算,得到這個表達式計算的值。玩概念,我不懂,????
還是舉個例子靠譜。????
比如我們要進行一個加法運算。在java中我們這樣寫:
int res = 1+1; // 2
若我用mvel則這樣寫:
Object res = MVEL.eval("1+1"); //2
是不是很吃驚????。“1+1”就是一個表達式,第一種我們是硬編碼實現的計算結果,但是第二種方案,直接給evel函數傳遞一個表達式字符串,直接能計算出結果。這樣如果想計算1-1。直接傳人不同的表達式即可。現在要計算'(2+2)*3+5/2'或'2>1?1+1:2+2'。來吧你硬編碼試試這些計算?是不是又要多寫幾行代碼,而且不便擴展。
你以為mvel只能做這些了?那就真的是太年輕了。目前mvel支持大量的語法,條件,循環等。還可以支持自定義函數,這就????了。那么我們工作中用這東西來干嘛?
數據流轉就是不同對象間數據的轉換。比如a對象數據通過某些規則轉化為b對象數據。ca,這說的是不是數據清洗???。對,說的沒錯,但是數據清洗只是其中的一個具體項罷了。????,來個圖:
由圖可以看出兩個對象name和age都是一對一映射,但是目標對象不需要sex字段,但是多了一個出生年的字段,而且是通過年齡計算而來。下面我們就以代碼來模擬一下這個轉換過程,在這里我對象都用map來定義。
HashMap<Object, Object> srcMap = Maps.newHashMap(); srcMap.put("name","zs"); srcMap.put("age",10); srcMap.put("sex","女"); //字段映射關系 HashMap<String, String> mapping = Maps.newHashMap(); mapping.put("name","name"); mapping.put("age","age"); //這里先把當前年份寫死為2019 mapping.put("birthYear","2019-age"); //目標對象 HashMap<Object, Object> targetMap = Maps.newHashMap(); //k為目標表字段,v為轉換規則 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("目標對象"+targetMap); //目標對象{birthYear=2009, name=zs, age=10}
對就這么簡單,但是我們這里計算出生年份中的當前年份寫死了啊。明細不不是我們想要的,沒事我們慢慢來。
.自定義函數
定義獲取當前年份函數
/** * 獲取當前年份方法 * @return */ public static Object getCurrentYear(){ Calendar date = Calendar.getInstance(); String year = String.valueOf(date.get(Calendar.YEAR)); return year; }
.將自定義函數注冊
直接上代碼
static ParserContext context = new ParserContext(); static { //MvelTest是getCurrentYear函數的類 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的作用就是將我們的規則進行編譯成mvel可以識別的一個過程
birthYear規則替換為mapping.put("birthYear","getCurrentYear()-age");執行得到相同的結果。
有了這些我們可以自定義更多的轉換規則,還可以借此開發一套用戶配置工具,根據用戶自己的配置,進行相應的資源映射。得到想要的目標數據。
關于如何理解在項目中使用到的MVEL就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。