最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

目標(biāo)&背景

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

1.查詢訂單列表。

2.批量查詢物流信息。

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

假設(shè)我們定義了一個(gè)訂單類,具有幾個(gè)關(guān)鍵的屬性:訂單號(hào),狀態(tài),訂單價(jià),快遞信息。如下所示:

class Order{
  String orderSeq;
  String status;
  double totalPrice;
  String expressInfo;
  // 省略get,set及hashCode等方法
} 

我們定義了一個(gè)快遞信息類,幾個(gè)關(guān)鍵的屬性:訂單號(hào),物流公司,物流單號(hào),物流狀態(tài)。如下所示:

class ExpressInfo{
  String orderSeq;
  String expressName;
  String expressNo;
  String createTime;
  String statusInfo;
  // 省略get,set及hashCode等方法
}

Java7 實(shí)現(xiàn)

獲取訂單列表 & 抽取訂單號(hào)

  List<Order> orderList = getOrderList();
  // 抽取 訂單號(hào)
  List<String> orderSeqList = new ArrayList<>();
  for (Order order : orderList) {
    orderSeqList.add(order.getOrderSeq());
  }

這里我們獲取了訂單列表orderList,此時(shí)expressInfo里邊是沒(méi)有數(shù)據(jù)的。這里抽取單號(hào)依然是Java傳統(tǒng)的寫(xiě)法。

批量查詢快遞信息 & 組裝 訂單-快遞信息 map

由于我們是通過(guò)調(diào)用遠(yuǎn)程服務(wù)來(lái)獲取快遞信息,為了減少網(wǎng)絡(luò)通信次數(shù),我們采取批量查詢的方式。這也是為什么,上一步中我們要抽取訂單號(hào)

下面我們來(lái)獲取快遞信息

// 調(diào)用遠(yuǎn)程服務(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常用的寫(xiě)法。

組合數(shù)據(jù),將快遞信息填充進(jìn)訂單#

for(Order order:orderList){
  String expressInfo = orderExpressMap.get(order.getOrderSeq());
  order.setExpressInfo(expressInfo);
}

至此,我們使用Java7 的寫(xiě)法,完成了開(kāi)篇設(shè)定的目標(biāo)。下面我們看Java8的寫(xiě)法

Java8 實(shí)現(xiàn)

獲取訂單列表 & 抽取訂單號(hào)#

// 獲取列表
List<Order> orderList = getOrderList();
// 抽取單號(hào)
List<String> orderSeqs = orderList.stream()
    .map(Order::getOrderSeq)
    .collect(Collectors.toList());

這里我們使用了stream.map,在map()中,我們的寫(xiě)法是Order::getOrderSeq表示調(diào)用Order對(duì)象的getOrderSeq()方法來(lái)抽取訂單號(hào)。

這里的::叫“方法應(yīng)用”,是Java8中的新寫(xiě)法。

在map()后面緊跟的是collect收集器,他將抽取的數(shù)據(jù)toList(),于是我們得到了最終的List。

批量查詢快遞信息 & 組裝 訂單-快遞信息 map

下面我們?nèi)匀皇峭ㄟ^(guò)遠(yuǎn)程調(diào)用來(lái)獲取快遞信息,然后使用Java8的語(yǔ)法建立一個(gè) 訂單-快遞 關(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來(lái)收集數(shù)據(jù),收集成什么形式呢?看名知意,Collectors.toMap收集成Map,收集什么數(shù)據(jù)呢?toMap()中,寫(xiě)了ExpressInfo::getOrderSeq及ExpressInfo::getStatusInfo,即:抽取orderSeq作為key,statusInfo作為value。

至此,訂單數(shù)據(jù),訂單-物流關(guān)系數(shù)據(jù)map都得到了,下面我們來(lái)組合數(shù)據(jù)。

組合數(shù)據(jù),將快遞信息填充進(jìn)訂單#
經(jīng)過(guò)上面啰嗦的兩步,我們得到了符合我們要求的數(shù)據(jù),現(xiàn)在我們需要根據(jù)顏值高低進(jìn)行排名,代碼如下:

orderList.stream().forEach(o -> o.setExpressInfo(orderExpressMap.get(o.getOrderSeq())));

你沒(méi)看錯(cuò),就只有這么一行。

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于slf4j_log4j2源碼學(xué)習(xí)心得

    關(guān)于slf4j_log4j2源碼學(xué)習(xí)心得

    這篇文章主要介紹了slf4j_log4j2源碼學(xué)習(xí)心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java垃圾回收之復(fù)制算法詳解

    Java垃圾回收之復(fù)制算法詳解

    今天小編就為大家分享一篇關(guān)于Java垃圾回收之復(fù)制算法詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Netty分布式高性能工具類FastThreadLocal和Recycler分析

    Netty分布式高性能工具類FastThreadLocal和Recycler分析

    這篇文章主要為大家介紹了Netty分布式高性能工具類FastThreadLocal和Recycler分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • mybatis-plus 使用Condition拼接Sql語(yǔ)句各方法的用法

    mybatis-plus 使用Condition拼接Sql語(yǔ)句各方法的用法

    這篇文章主要介紹了mybatis-plus 使用Condition拼接Sql語(yǔ)句各方法的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java ResultSet案例講解

    Java ResultSet案例講解

    這篇文章主要介紹了Java ResultSet案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java?循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程

    Java?循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程

    循環(huán)隊(duì)列又叫環(huán)形隊(duì)列,是一種特殊的隊(duì)列。循環(huán)隊(duì)列解決了隊(duì)列出隊(duì)時(shí)需要將所有數(shù)據(jù)前移一位的問(wèn)題。本文將帶大家詳細(xì)了解循環(huán)隊(duì)列如何實(shí)現(xiàn),需要的朋友可以參考一下
    2022-02-02
  • java 實(shí)現(xiàn)切割文件和合并文件的功能

    java 實(shí)現(xiàn)切割文件和合并文件的功能

    這篇文章主要介紹了java 實(shí)現(xiàn)切割文件和合并文件的功能的相關(guān)資料,這里實(shí)現(xiàn)文件的切割的實(shí)現(xiàn)代碼和文件合并的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-07-07
  • 兩種JAVA實(shí)現(xiàn)短網(wǎng)址服務(wù)算法

    兩種JAVA實(shí)現(xiàn)短網(wǎng)址服務(wù)算法

    這篇文章介紹了兩種JAVA實(shí)現(xiàn)短網(wǎng)址服務(wù)算法,一種是基于MD5碼的,一種是基于自增序列的,需要的朋友可以參考下
    2015-07-07
  • Java中Math類常用方法代碼詳解

    Java中Math類常用方法代碼詳解

    本文是小編最新給大家整理的關(guān)于Java中Math類常用方法的知識(shí),通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2017-07-07
  • Spring五大類注解讀取存儲(chǔ)Bean對(duì)象的方法

    Spring五大類注解讀取存儲(chǔ)Bean對(duì)象的方法

    這篇文章主要介紹了Spring五大類注解讀取存儲(chǔ)Bean對(duì)象,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09

最新評(píng)論

申扎县| 鹰潭市| 泰州市| 滁州市| 洪江市| 南郑县| 灌云县| 鸡泽县| 墨江| 新乐市| 扶风县| 高州市| 元氏县| 平果县| 长治市| 广宗县| 准格尔旗| 都安| 石台县| 宁化县| 武汉市| 遂宁市| 宁明县| 定州市| 苏尼特右旗| 开江县| 都昌县| 淳安县| 宝鸡市| 叙永县| 临沭县| 水城县| 贵溪市| 乌海市| 七台河市| 花莲市| 广宁县| 河曲县| 浦县| 京山县| 肥东县|