您好,登錄后才能下訂單哦!
這篇文章主要介紹了基于Java8 Stream API如何實現(xiàn)數(shù)據(jù)抽取收集,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
目標&背景
我們以“處理訂單數(shù)據(jù)”為例,假設(shè)我們的應(yīng)用是一個分布式應(yīng)用,有"訂單應(yīng)用","物流應(yīng)用","商品應(yīng)用”等都是獨立的服務(wù)。本次我們的目的需要展示訂單列表完整數(shù)據(jù):
1.查詢訂單列表。
2.批量查詢物流信息。
3.將物流信息填充到訂單主信息中。
假設(shè)我們定義了一個訂單類,具有幾個關(guān)鍵的屬性:訂單號,狀態(tài),訂單價,快遞信息。如下所示:
class Order{ String orderSeq; String status; double totalPrice; String expressInfo; // 省略get,set及hashCode等方法 }
我們定義了一個快遞信息類,幾個關(guān)鍵的屬性:訂單號,物流公司,物流單號,物流狀態(tài)。如下所示:
class ExpressInfo{ String orderSeq; String expressName; String expressNo; String createTime; String statusInfo; // 省略get,set及hashCode等方法 }
Java7 實現(xiàn)
獲取訂單列表 & 抽取訂單號
List<Order> orderList = getOrderList(); // 抽取 訂單號 List<String> orderSeqList = new ArrayList<>(); for (Order order : orderList) { orderSeqList.add(order.getOrderSeq()); }
這里我們獲取了訂單列表orderList,此時expressInfo里邊是沒有數(shù)據(jù)的。這里抽取單號依然是Java傳統(tǒng)的寫法。
批量查詢快遞信息 & 組裝 訂單-快遞信息 map
由于我們是通過調(diào)用遠程服務(wù)來獲取快遞信息,為了減少網(wǎng)絡(luò)通信次數(shù),我們采取批量查詢的方式。這也是為什么,上一步中我們要抽取訂單號
下面我們來獲取快遞信息
// 調(diào)用遠程服務(wù), List<ExpressInfo> expressInfos = RpcGetExpressInfoBatch(orderSeqList); // 組裝 訂單-快遞 關(guān)系map Map<String,String> orderExpressMap = new HashMap<>(); for(ExpressInfo e: expressInfos){ orderExpressMap.put(e.getOrderSeq(),e.getStatusInfo()); }
這里組裝map,也依然是Java7常用的寫法。
組合數(shù)據(jù),將快遞信息填充進訂單#
for(Order order:orderList){ String expressInfo = orderExpressMap.get(order.getOrderSeq()); order.setExpressInfo(expressInfo); }
至此,我們使用Java7 的寫法,完成了開篇設(shè)定的目標。下面我們看Java8的寫法
Java8 實現(xiàn)
獲取訂單列表 & 抽取訂單號#
// 獲取列表 List<Order> orderList = getOrderList(); // 抽取單號 List<String> orderSeqs = orderList.stream() .map(Order::getOrderSeq) .collect(Collectors.toList());
這里我們使用了stream.map,在map()中,我們的寫法是Order::getOrderSeq表示調(diào)用Order對象的getOrderSeq()方法來抽取訂單號。
這里的::叫“方法應(yīng)用”,是Java8中的新寫法。
在map()后面緊跟的是collect收集器,他將抽取的數(shù)據(jù)toList(),于是我們得到了最終的List。
批量查詢快遞信息 & 組裝 訂單-快遞信息 map
下面我們?nèi)匀皇峭ㄟ^遠程調(diào)用來獲取快遞信息,然后使用Java8的語法建立一個 訂單-快遞 關(guān)聯(lián)信息的map。
List<ExpressInfo> expressInfos = RpcGetExpressInfoBatch(orderSeqList); Map<String,String> orderExpressMap =expressInfos.stream() .collect(Collectors.toMap(ExpressInfo::getOrderSeq,ExpressInfo::getStatusInfo));
這里代碼比Java7的要少吧,且一目了然,這里用strean().collect來收集數(shù)據(jù),收集成什么形式呢?看名知意,Collectors.toMap收集成Map,收集什么數(shù)據(jù)呢?toMap()中,寫了ExpressInfo::getOrderSeq及ExpressInfo::getStatusInfo,即:抽取orderSeq作為key,statusInfo作為value。
至此,訂單數(shù)據(jù),訂單-物流關(guān)系數(shù)據(jù)map都得到了,下面我們來組合數(shù)據(jù)。
組合數(shù)據(jù),將快遞信息填充進訂單#
經(jīng)過上面啰嗦的兩步,我們得到了符合我們要求的數(shù)據(jù),現(xiàn)在我們需要根據(jù)顏值高低進行排名,代碼如下:
orderList.stream().forEach(o -> o.setExpressInfo(orderExpressMap.get(o.getOrderSeq())));
Java中的集合主要分為四類:1、List列表:有序的,可重復的;2、Queue隊列:有序,可重復的;3、Set集合:不可重復;4、Map映射:無序,鍵唯一,值不唯一。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“基于Java8 Stream API如何實現(xiàn)數(shù)據(jù)抽取收集”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。