1. 程式人生 > >MULE DataWeave Language Map操作符使用

MULE DataWeave Language Map操作符使用

工具 版本
mule-standalone 3.9.0
Anypoint-Studio 6.4.0

遍歷操作是程式設計中經常使用到的操作,在DataWeave Language中,遍歷需要使用到的是操作符是Map。同時也借Map操作符來進一步瞭解DataWeave Language的使用規律,畢竟操作符語法之間並不存在太大差異,徹底掌握一個操作符的運用後,那麼其他操作符使用起來相信也不會太難了。

Returns an array that is the result of applying a transformation function (lambda) to each of the elements. The lambda is invoked with two parameters: index and the value. If these parameters are not named, the index is defined by default as $$ and the value as $.

首先這段話有一個奇怪的名詞,那就是lambda(即數學裡面的λ),經過網上搜索,Mule使用了lambda表示式。如果想了解lambda表示式,或許可以看一下這篇我找的博文,從java角度解釋lambda 點這裡
官網說,這個Map操作符返回一個array,這個array是經過function(λ)處理後的結果。λ有兩個引數,一個是value,一個是index。如果這兩個引數沒有被命名,value使用$代替,index使用$$代替。
官網給出了一個直觀的例子:

%dw 1.0
%output application/json
---
users: ["john", "peter", "matt"] map ((firstName, position) -> position ++ ":" ++ upper firstName)

其中map ((firstName, position) -> position ++ ":" ++ upper firstName)就是一個lambda表示式,請注意第一個引數是value,第二個引數是index。正如上面所說,引數沒有命名才使用$符號來代替。而表示式中->是lambda的語法。不必太糾結於lambda的語法,重點關注點是->後的內容,因為這裡才是輸出的結構定義。處理的輸入是[“john”, “peter”, “matt”],然後通過map操作符會使得每一個數組元素都按照你所設定的格式轉變。
而需要注意,++符號不是自增的意思,而是DataWeave裡面的字串拼接符號。如果你使用一個+則會報錯。upper也是關鍵字,作用使value值大寫。
最後的輸出結果如下:

{
    "users": [
        "0:JOHN", 
        "1:PETER", 
        "2:MATT"
    ]
}

上面官網給出的例子結構上簡單,因此下面準備了一個XML輸入,相對結構複雜點。將其按照要求轉為所需JSON格式。
XML輸入

<?xml version='1.0' encoding='UTF-8'?>
<orders>
    <order>
        <product>
            <price>5</price>
            <model>MuleSoft Connect 2016</model>
        </product>
        <item_amount>3</item_amount>
        <payment>
            <payment-type>credit-card</payment-type>
            <currency>USD</currency>
            <installments>1</installments>
        </payment>
        <buyer>
            <email>[email protected]</email>
            <name>Michael</name>
            <address>Koala Boulevard 314</address>
            <city>San Diego</city>
            <state>CA</state>
            <postCode>1345</postCode>
            <nationality>USA</nationality>
        </buyer>
        <shop>main branch</shop>
        <salesperson>Mathew Chow</salesperson>
    </order>
    <order>
        <product>
            <price>10086</price>
            <model>MuleSoft Connect 2018</model>
        </product>
        <item_amount>2333</item_amount>
        <payment>
            <payment-type>credit-card</payment-type>
            <currency>USD</currency>
            <installments>1</installments>
        </payment>
        <buyer>
            <email>[email protected]</email>
            <name>cgydawn</name>
            <address>beijing,china 314</address>
            <city>San Diego</city>
            <state>AC</state>
            <postCode>123456</postCode>
            <nationality>USA</nationality>
        </buyer>
        <shop>meiyijia shop</shop>
        <salesperson>zhangsan</salesperson>
    </order>
</orders>

XML裡面根元素是orders,裡面包含兩個訂單資訊。每個訂單資訊裡面又包含產品資訊,產品購買數量,支付資訊,買家資訊,購買地點,銷售員名資訊。這些資訊裡面部分還有子資訊。

獲取該XML輸入中買家的資訊

達到目標的DataWeave語句

%dw 1.0
%output application/json
---
userInfo : payload.orders map {
    email : $.buyer.email,
    name : $.buyer.name,
    address : $.buyer.address,
    city : $.buyer.city,
    state : $.buyer.state,
    postCode : $.buyer.postCode,
    nationality : $.buyer.nationality
}

JSON輸出

需要注意:一開始的時候,按照遍歷的想法,我幾乎想也不想地直接寫出這樣的語句

%dw 1.0
%output application/json
---
userInfo : payload map {
    email : $.order.buyer.email
}

獲取不完全正確

這樣的語句並沒有報錯,同時還有輸出,但是僅僅只輸出了第一個訂單的電子郵箱資訊,然而目標輸入是有兩個訂單資訊的。那為什麼沒有遍歷兩次而只有一次?對比就知道實際是payloadpayload.orders的差別。如果你使用前者,按照我的理解,map拿去遍歷的長度相當於orders數量,即1。但是使用後者,map拿去遍歷的長度相當於order長度,即2。同時也應該留意到,map前的格式,會影響到你後續使用的層級關係。
使用payload給map操作符處理,則map直接處理的是payload(),$從其直接子元素order開始執行。
使用payload.orders給map操作符處理,則map直接處理的是payload.orders(),$從其直接子元素product,item_amount,payment,buyer之一開始。
因為需要獲取的是買家資訊,因此大括號內用的是$.buyer.xxx形式,當然使用$.product.model也是可以的,但那就不是獲取買家資訊了。

Using Map on an Object(對一個Object進行Map操作)

Map操作符除了對陣列類的資料進行處理外,官網還提示它可以對物件進行處理。官網例子將XML輸入轉為JSON輸出,並且將不同價位的美元價格按照給出的固定匯率轉為新的價格。
XML輸入

<?xml version='1.0' encoding='UTF-8'?>
<prices>
    <basic>9.99</basic>
    <premium>53</premium>
    <vip>398.99</vip>
</prices>

正確DataWeave語句一

%dw 1.0
%output application/json
%var conversionRate=13.45
---
priceList: payload.prices map (
  '$$':{
    dollars: $,
    localCurrency: $ * conversionRate
  }
)

正確DataWeave語句二

%dw 1.0
%output application/json
%var conversionRate=13.45
---
priceList: payload.prices map ((money, position) ->
  '$position':{
    dollars: money,
    localCurrency: money * conversionRate
  }
)

需要注意的是,語句二的語法形式上要求,如果index已經有了命名,則使用index時,需要在命名前加上$,然後用單引號包括。即'$position' 等價於 $$ 。 同時,index引數是可選的,因此下面形式也是正確的,只是不能輸出索引資訊。
正確DataWeave語句三

%dw 1.0
%output application/json
%var conversionRate=13.45
---
priceList: payload.prices map ((money) ->
  {
    dollars: money,
    localCurrency: money * conversionRate
  }
)

相關推薦

MULE DataWeave Language Map操作符使用

工具 版本 mule-standalone 3.9.0 Anypoint-Studio 6.4.0 遍歷操作是程式設計中經常使用到的操作,在DataWeave Language中,遍歷需要使用到的是操作符是Map。

不要使用有副作用的std.map.[]操作符

map的[]操作符包含隱性操作:當key不存在的時候,會預設執行insert操作 這種隱性操作在大多數情況下是有害的。 比如下面的程式碼: // 判斷是否有效技能ID inline BOOL KSkillManager::IsValidSkillID(int nSkillID)

Rxjava,Map操作符的例子

Map的作用 Map操作符的作用就是將Observable所傳送送的資訊進行格式轉換或者處理,然後轉變為另外一個型別,傳送給Observer 匯入依賴 def retrofit_version = "2.1.0" def rxjava_version = "2.0

EL(Expression Language)-EL操作符/EL表示式

Expression Language 在新專案中第一次接觸到這個,都是縮寫,全然看不懂,搜了一下是叫做EL操作符,也有叫EL表示式的,叫JSP 表示式語言的。暫時還不清楚其關係,根據搜尋結果整理合並了一下,先做此記錄。 操作符型別 術語

RxJava(二) map操作符用法詳解

RxJava系列文章目錄導讀: 1 map操作符的作用 Returns an Observable that applies a specified function to each item emitted by the source Obse

EnjoyingSoft之Mule ESB開發教程第四篇:Mule Expression Language - MEL表示式

目錄 1. MEL的優勢 2. MEL的使用場景 3. MEL的示例 4. MEL的上下文物件 5. MEL的Variable 6. MEL訪問屬性 7. MEL操作符 本篇主要介紹Mule表示式語言,Mule Expression Language,簡稱MEL。MEL是

Rxjava2.x 原始碼分析,Map操作符原始碼分析(二)

首先看一個小例子: Observable.create(new ObservableOnSubscribe<String>() { @Override public void subscribe(Observa

RxJava 操作符map

RxJava系列教程: map名詞是地圖的意思,那麼這樣理解這個操作符就很想不通這個操作符的 應用場景了,但我們敲程式碼的不可能不熟悉這一個資料結構. 在我使用這個操作符的理解中,map就是變換需要操作的資料內容或者結構的意思。所以其使用場景顯而易見

給初學者的RxJava2.0教程(三):【操作符Map、FlatMap、ConcatMap】

前言 上一節講解了執行緒排程, 並且舉了兩個實際中的例子, 其中有一個登入的例子, 不知大家有沒有想過這麼一個問題, 如果是一個新使用者, 必須先註冊, 等註冊成功之後再自動登入該怎麼做呢. 很明顯, 這是一個巢狀的網路請求, 首先需要去請求

RxJava2 轉換操作符Map()方法

前言: 本文將在Rx官方解釋的基礎上,再融合其它國內講解的文章。儘量用最簡單的,易懂的方式,解釋map()操作符。解釋的過程,以問答的形式,先從整體簡單解釋入手,並配上能跑的示例程式碼(0 warnings, 0 errors)。先知道能做什麼和怎麼做,再講原

RxJava2操作符Map

//RxJava2 Map操作符 /** * Map操作符的作用就是將Observable所傳送送的資訊進行格式轉換或者處理, * 然後轉變為另外一個型別,傳送給Observer */

map的[]操作符的注意事項

        在一個類Class A中宣告一個常函式AnsiString GPV(const AnsiString& sSec,const AnsiString& sK) const;和一個私有變數map<AnsiString,AnsiString&

遍歷map

sys htm shm key .com ext hashmap iter system public static void main(String[] args) { Map<String, String> map = new HashMap<St

Map遍歷四種常用方法

map.entry pri ext try set next() 方式 keys println Map常用四種遍歷方式 一:   Map<String,String> map = new HashMap<String,String>();

HDU 2112 HDU Today(STL MAP + Djistra)

stl eof dji int ble mes tin std n) 題目鏈接:HDU Today 立即集訓要開始,抓緊時間練練手,最短路的基礎題,第一次用STL的map 題目非常水,可是錯了N遍。手賤了。本題不優點理的就是把地名轉化為數字 #include

Spring中使用Map、Set、List、數組、屬性集合的註入方法配置文件

查看 main list highlight 配置 spring配置 pla lec while (1)下邊的一個Java類包含了所有Map、Set、List、數組、屬性集合等這些容器,主要用於演示spring的註入配置; [java] view plain c

jmap命令(Java Memory Map)的使用

notes read 一個 net file 64位 pac mem tools jmap的使用能夠參考: 官方文檔 http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html 和這篇博客 h

數組中出現最多的數,以及接口 Map.Entry<K,V>

int try tools pub length rem value contains span 1 package test.tools; 2 3 import java.util.Collection; 4 import java.util.Collecti

List、Set、Map下各類型的對比

hashtable class ray hashmap 速查 使用 線程同步 highlight ash 1.List和Set: List: 元素有放入順序,元素可重復,查找效率高,插入刪除效率低; Set: 元素無放入順序,元素不可重復,(元素雖然無順序,但元素在Set

窩上課不聽,how to learn C language easily(1)

程序 簡單 小數 如果 如何 好處 class 數組 指針 C language 學習心得 附:為啥起這麽霸氣側漏,招大神們鄙視的標題,正如我在《C language》隨筆的介紹中寫的,這是一個寫個妹紙們看的C language的文章。沒錯!!寫這篇文章的靈感也來自於上周C