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
}
獲取不完全正確
這樣的語句並沒有報錯,同時還有輸出,但是僅僅只輸出了第一個訂單的電子郵箱資訊,然而目標輸入是有兩個訂單資訊的。那為什麼沒有遍歷兩次而只有一次?對比就知道實際是payload
和payload.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