欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Java8 Stream API實現(xiàn)數(shù)據(jù)抽取收集

 更新時間:2020年03月03日 10:16:01   作者:逃離沙漠  
這篇文章主要介紹了基于Java8 Stream API實現(xiàn)數(shù)據(jù)抽取收集,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

目標&背景

我們以“處理訂單數(shù)據(jù)”為例,假設我們的應用是一個分布式應用,有"訂單應用","物流應用","商品應用”等都是獨立的服務。本次我們的目的需要展示訂單列表完整數(shù)據(jù):

1.查詢訂單列表。

2.批量查詢物流信息。

3.將物流信息填充到訂單主信息中。

假設我們定義了一個訂單類,具有幾個關(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ǎng)絡通信次數(shù),我們采取批量查詢的方式。這也是為什么,上一步中我們要抽取訂單號

下面我們來獲取快遞信息

// 調(diào)用遠程服務,
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 的寫法,完成了開篇設定的目標。下面我們看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()方法來抽取訂單號。

這里的::叫“方法應用”,是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())));

你沒看錯,就只有這么一行。

總結(jié)#
本節(jié),我們使用Java8 Stream API,完成了數(shù)據(jù)的抽取和收集,使用了map(),和collect()來完成數(shù)據(jù)的抽取和收集,并了解了兩種收取方式toList和toMap。所以,以后如果有人問你"Java8 stream 如何獲取對象的某個屬性list???",“java8 stream 如何獲取指定數(shù)據(jù)組裝成map啊?”,你就可以把本文中的方法告訴他了。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java自旋鎖和JVM對鎖的優(yōu)化詳解

    java自旋鎖和JVM對鎖的優(yōu)化詳解

    這篇文章主要為大家介紹了java自旋鎖和JVM對鎖的優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Java中的CountDownLatch閉鎖詳解

    Java中的CountDownLatch閉鎖詳解

    這篇文章主要介紹了Java中的CountDownLatch閉鎖詳解,CountDownLatch用給定的計數(shù)初始化,await屬于阻塞方法,直到當前計數(shù)達到零,由于countDown方法被調(diào)用,然后釋放所有await等待的線程,并立即返回線程后續(xù)的await調(diào)用邏輯,需要的朋友可以參考下
    2023-12-12
  • Java String、StringBuffer與StringBuilder的區(qū)別

    Java String、StringBuffer與StringBuilder的區(qū)別

    本文主要介紹Java String、StringBuffer與StringBuilder的區(qū)別的資料,這里整理了相關(guān)資料及詳細說明其作用和利弊點,有需要的小伙伴可以參考下
    2016-09-09
  • Netty實戰(zhàn)入門教程之?什么是Netty

    Netty實戰(zhàn)入門教程之?什么是Netty

    Java中支持三種網(wǎng)絡編程IO模型,BIO、NIO、AIO,Netty對NIO又做了一層封裝,本文帶領(lǐng)我們了解Netty到底是什么,Netty入門案例,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • Netty分布式flush方法刷新buffer隊列源碼剖析

    Netty分布式flush方法刷新buffer隊列源碼剖析

    這篇文章主要為大家介紹了Netty分布式flush方法刷新buffer隊列源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Java多線程中線程的兩種創(chuàng)建方式及比較代碼示例

    Java多線程中線程的兩種創(chuàng)建方式及比較代碼示例

    這篇文章主要介紹了Java多線程中線程的兩種創(chuàng)建方式及比較代碼示例,簡單介紹了線程的概念,并行與并發(fā)等,然后通過實例代碼向大家展示了線程的創(chuàng)建,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java經(jīng)驗點滴:類注釋文檔編寫方法

    Java經(jīng)驗點滴:類注釋文檔編寫方法

    Java經(jīng)驗點滴:類注釋文檔編寫方法...
    2006-12-12
  • Java鏈表(Linked List)基本原理與實現(xiàn)方法入門示例

    Java鏈表(Linked List)基本原理與實現(xiàn)方法入門示例

    這篇文章主要介紹了Java鏈表(Linked List)基本原理與實現(xiàn)方法,結(jié)合實例形式分析了Java鏈表(Linked List)的功能、原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下
    2020-03-03
  • MyBatis?@Select注解介紹:基本用法與動態(tài)SQL拼寫方式

    MyBatis?@Select注解介紹:基本用法與動態(tài)SQL拼寫方式

    這篇文章主要介紹了MyBatis?@Select注解介紹:基本用法與動態(tài)SQL拼寫方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java的HashTable源碼解讀

    Java的HashTable源碼解讀

    這篇文章主要介紹了Java的HashTable源碼解讀,HashTable繼承了Dictionary類,提供了一些字典相關(guān)的基本功能如添加、刪除、判空、獲取元素數(shù)量等,需要的朋友可以參考下
    2023-12-12

最新評論