1. 程式人生 > >何用Java8 Stream API進行資料抽取與收集

何用Java8 Stream API進行資料抽取與收集

上一篇中我們通過一個例項看到了Java8 Stream API 相較於傳統的的Java 集合操作的簡潔與優勢,本篇我們依然藉助於一個實際的例子來看看Java8 Stream API 如何抽取及收集資料。
備註:上一篇內容:如何用Java8 Stream API找到心儀的女朋友

## 目標&背景
我們以“處理訂單資料”為例,假設我們的應用是一個分散式應用,有"訂單應用","物流應用","商品應用”等都是獨立的服務。本次我們的目的需要展示訂單列表完整資料:

  • 1.查詢訂單列表。
  • 2.批量查詢物流資訊。
  • 3.將物流資訊填充到訂單主資訊中。

假設我們定義了一個訂單類,具有幾個關鍵的屬性:訂單號,狀態,訂單價,快遞資訊。如下所示:

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

我們定義了一個快遞資訊類,幾個關鍵的屬性:訂單號,物流公司,物流單號,物流狀態。如下所示:

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

Java7 實現

獲取訂單列表 & 抽取訂單號

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

這裡我們獲取了訂單列表orderList,此時expressInfo裡邊是沒有資料的。這裡抽取單號依然是Java傳統的寫法。

批量查詢快遞資訊 & 組裝 訂單-快遞資訊 map

由於我們是通過呼叫遠端服務來獲取快遞資訊,為了減少網路通訊次數,我們採取批量查詢的方式。這也是為什麼,上一步中我們要抽取訂單號
下面我們來獲取快遞資訊

// 呼叫遠端服務,
List<ExpressInfo> expressInfos = RpcGetExpressInfoBatch(orderSeqList);
// 組裝 訂單-快遞 關係map
Map<String,String> orderExpressMap = new HashMap<>();
for(ExpressInfo e: expressInfos){
    orderExpressMap.put(e.getOrderSeq(),e.getStatusInfo());
}

這裡組裝map,也依然是Java7常用的寫法。

組合資料,將快遞資訊填充進訂單

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

至此,我們使用Java7 的寫法,完成了開篇設定的目標。下面我們看Java8的寫法

Java8 實現

獲取訂單列表 & 抽取訂單號

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

這裡我們使用了stream.map,在map()中,我們的寫法是Order::getOrderSeq表示呼叫Order物件的getOrderSeq()方法來抽取訂單號。
這裡的::叫“方法應用”,是Java8中的新寫法。
map()後面緊跟的是collect收集器,他將抽取的資料toList(),於是我們得到了最終的List

批量查詢快遞資訊 & 組裝 訂單-快遞資訊 map

下面我們仍然是通過遠端呼叫來獲取快遞資訊,然後使用Java8的語法建立一個 訂單-快遞 關聯資訊的map。

List<ExpressInfo> expressInfos = RpcGetExpressInfoBatch(orderSeqList);
Map<String,String> orderExpressMap =expressInfos.stream()
        .collect(Collectors.toMap(ExpressInfo::getOrderSeq,ExpressInfo::getStatusInfo));

這裡程式碼比Java7的要少吧,且一目瞭然,這裡用strean().collect來收集資料,收整合什麼形式呢?看名知意,Collectors.toMap收整合Map,收集什麼資料呢?toMap()中,寫了ExpressInfo::getOrderSeqExpressInfo::getStatusInfo,即:抽取orderSeq作為key,statusInfo作為value。

至此,訂單資料,訂單-物流關係資料map都得到了,下面我們來組合資料。

組合資料,將快遞資訊填充進訂單

經過上面囉嗦的兩步,我們得到了符合我們要求的資料,現在我們需要根據顏值高低進行排名,程式碼如下:

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

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

總結

本節,我們使用Java8 Stream API,完成了資料的抽取和收集,使用了map(),和collect()來完成資料的抽取和收集,並瞭解了兩種收取方式toListtoMap。所以,以後如果有人問你"Java8 stream 如何獲取物件的某個屬性list啊?",“java8 stream 如何獲取指定資料組裝成map啊?”,你就可以把本文中的方法告訴他了。

除此之外,Java8 Streap API 還有分組 等功能,後面再說。你也可以關注我的公眾號,第一時間收到推送。

相關推薦

何用Java8 Stream API進行資料抽取收集

上一篇中我們通過一個例項看到了Java8 Stream API 相較於傳統的的Java 集合操作的簡潔與優勢,本篇我們依然藉助於一個實際的例子來看看Java8 Stream API 如何抽取及收集資料。 備註:上一篇內容:如何用Java8 Stream API找到心儀的女朋友 ## 目標&背景 我們以

手把手教你使用Kettle JAVA API進行資料抽取

Kettle作為一款優秀的資料抽取程式,因為高效穩定的效能,一直被廣大使用者所喜愛,並且還在國內廣受好評。因為其本身使用純JAVA編寫,所以其JAVA API使用起來自然也是非常簡便。雖然其本身自帶的元件已經非常好用,並且能夠滿足豐富的場景。但可能有些場景下,我們可能

何用Java8 Stream API找到心儀的女朋友

傳統的的Java 集合操作是有些囉嗦的,當我們需要對結合元素進行過濾,排序等操作的時候,通常需要寫好幾行程式碼以及定義臨時變數。 而Java8 Stream API 可以極大簡化這一操作,程式碼行數少,且易讀。 我們以“找女朋友”為例來看看Java8的Stream API相比傳統寫法有多香。假設我們定義了一個

Fork/Join框架Java8 Stream API 之並行流的速度比較

  Fork/Join 框架有特定的ExecutorService和執行緒池構成。ExecutorService可以執行任務,並且這個任務會被分解成較小的任務,它們從執行緒池中被fork(被不同的執行緒執行)出來,在join(即它的所有的子任務都完成了)之前會一直等待。   Fork/Join 使用了任務竊

使用Java8 Stream API對Map按鍵或值進行排序

一、什麼是Java 8 Stream 使用Java 8 Streams,我們可以按鍵和按值對對映進行排序。下面是它的工作原理: 將Map或List等集合類物件轉換為Stream物件 使用Streams的sorted()方法對其進行排序 最終將其返回為LinkedHashMap(可以保留排序順序) so

推薦書籍必有連結】利用python進行資料分析推薦系統

資料分析是指用適當的統計分析方法對收集來的大量資料進行分析,提取有用資訊和形成結論而對資料加以詳細研究和概括總結的過程。這一過程也是質量管理體系的支援過程。在實用中,資料分析可幫助人們作出判斷,以便採取適當行動 由於有很多小夥伴們,在後臺諮詢有沒有資料分析相關的推薦,這裡推薦一本在京東上

利用java8 stream api 實現List集合分頁獲取工具

package com.test.paging; import java.util.Arrays; import java.util.List; /** * @author kevin.chen * Date 2017/11/9 * Time 18:05

Java8————Stream API

引言 Java8 加入了java.util.stream包,這個包中的相關API將極大的增強容器物件對元素的操作能力。 它專注於對集合物件進行各種便利、高效的聚合操作,或大批量資料處理。 Stream API藉助於同樣新出現的Lambda表示式,極大的提高了程式設計效率

在 DataList 中進行資料編輯刪除操作概述

  簡介 在資料插入、更新和刪除概述 教程中,我們已經就如何使用應用程式架構、ObjectDataSource 以及 GridView 、DetailsView 和FormView 控制元件進行插入、更新以及刪除資料操作進行了討論。使用 ObjectDataSource 以

JAVA8 Stream API的使用

/** * @auther hhh * @date 2018/12/31 12:48 * @description Stream流:用來處理陣列、集合的API * 1、不是資料結構,沒有內部儲存(只是用來操作與處理) * 2、不支援索引訪問 * 3、延遲計算

使用Java呼叫ElasticSearch提供的相關API進行資料搜尋完整例項演示

package org.dennisit.elastic.process; import java.util.ArrayList; import java.util.List; import org.dennisit.entity.DataFactory; import org.dennisit.entit

Java8 Stream API介紹

http://blog.csdn.net/chaoer89/article/details/52389458  目錄(?)[-] Stream的建立 Stream的簡單使用 收集結果 Optional型別 函式式介面

使用阿里雲網關api進行資料的請求

1.在node專案中 install 需要的包npm install aliyun-api-gateway -S2.新增完成後根據官方文件進行編輯client端上程式碼(前提是在阿里雲網關部分已經設定好了相關的網管api內容,這邊只講述前端進行呼叫的部分)export asy

Datax Azkaban 實現資料抽取排程

1.什麼是DataX DataX 是阿里巴巴集團內被廣泛使用的離線資料同步工具/平臺,實現包括 MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、ODPS 等各種異構資料來源之間高效的資料同步功能。DataX採用了框架 + 外掛 的模式,

php進行資料備份還原

<pre name="code" class="php"><?php class dbBackup { public $host='localhost'; //資料庫地址 public $user='root'; //登入名

Java8筆記第七篇(Stream API 的操作->規約,收集

深入 java8 第 07 篇 ( Stream API 的操作->規約,收集 ) 一、Stream API 的操作步驟: 建立 Stream 中間操作 終止操作(終端操作 ->

Redis 通過 RDB 方式進行資料備份還原

# Redis 通過 RDB 方式進行資料備份與還原 ## Intro 有的時候我們需要對 Redis 的資料進行遷移,今天介紹一下通過 RDB(快照)檔案進行 Redis 資料的備份和還原 ## Redis 持久化 Redis 的資料持久化有兩種機制,一種是 RDB(Redis Database),

Java8新特性Stream APILambda表示式詳解(1)

1 為什麼需要Stream與Lambda表示式? 1.1  為什麼需要Stream Stream作為 Java 8 的一大亮點,它與 java.io 包裡的 InputStream 和 OutputStream 是完全不同的概念。它也不同於 StAX 對 XML 解析的 S

Java8 Lambda表示式Stream API (一):Lambda表示式

你要知道的Java8 匿名內部類、函式式介面、lambda表示式與Stream API都在這裡 本文主要講解Java8 Stream API,但是要講解這一部分需要匿名內部類、lambda表示式以及函式式介面的相關知識,本文將分為兩篇文章來講解上述內容,讀