91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

發布時間:2021-11-09 17:56:19 來源:億速云 閱讀:155 作者:柒染 欄目:大數據

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

1.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支持大量的語法,條件,循環等。還可以支持自定義函數,這就????了。那么我們工作中用這東西來干嘛?

2.在自定義數據流轉中的使用

① 啥是數據流轉

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

由圖可以看出兩個對象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就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

正宁县| 齐齐哈尔市| 务川| 台南县| 长兴县| 阳春市| 名山县| 龙井市| 大石桥市| 营口市| 扶绥县| 宁波市| 抚顺市| 从江县| 庆云县| 芒康县| 休宁县| 安宁市| 乌拉特前旗| 威信县| 额尔古纳市| 奉新县| 汕头市| 大埔县| 石屏县| 六枝特区| 南木林县| 晋中市| 康平县| 泾川县| 沅陵县| 资溪县| 哈密市| 洛川县| 高密市| 扎兰屯市| 侯马市| 陇西县| 朝阳市| 永寿县| 依安县|