一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 用Java8 stream處理數據

用Java8 stream處理數據

2022-03-11 10:53banq Java教程

這篇文章主要介紹了用Java8 stream處理數據,Java 8 API的設計者重新提出了一個新的抽象稱為流Stream,可以讓我們以一種聲明的方式處理數據,此外,數據流可以充分利用多核架構而無需編寫多線程的一行代碼,下面我們一起來看看文

1、stream處理數據介紹

  如果沒有集合Collection你如何處理數據?幾乎所有的Java應用程序都要使用Collection處理數據。他們是十分重要的編程工作:例如,您可能想要創建銀行交易的集合Collection,這個集合代表客戶的狀態。然后,你可能要處理整個集合來找出的顧客花了多少錢。盡管集合如此重要,但是在Java中處理集合的技術還遠遠不夠完善。

首先,對集合的典型處理模式是類似SQL操作,比如"finding"(例如,找到具有最高價的交易)或"grouping" (例如,將相關的雜物所有交易合并組) 。大多數數據庫讓您這樣的聲明方式指定的操作。例如,下面的SQL查詢可以讓您找到交易ID最高值: "SELECT id, MAX(value) from transactions" 。

正如你所看到的,我們并不需要實現如何具體計算最大值(例如,使用循環和一個變量來跟蹤的最高值) 。我們只能表達我們所期望的要求(獲得最大值)。只要我們顯式發出這樣的查詢,數據庫就會為我們去處理??墒菫槭裁次覀儾荒茉诩?code>Collection中實現類似的東西?多少次,你會發現自己使用循環一遍又一遍的反復遍歷集合?(如:for Object o: myLists{ ..})

其次,如何才能有效地處理真正的大數據集合?在理想的情況下,你想利用多核架構加快處理,。然而,編寫并行代碼很難而且容易出錯。

Java 8 API的設計者重新提出了一個新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數據。此外,數據流可以充分利用多核架構而無需編寫多線程的一行代碼。這聽起來不錯,不是嗎?

首先,我們看看在Java 7中,如何發現typegrocery 的所有交易,然后返回以交易值降序排序好的交易ID集合?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
List<Transaction> groceryTransactions = new Arraylist<>();
 
for(Transaction t: transactions){
 
  if(t.getType() == Transaction.GROCERY){
 
    groceryTransactions.add(t);
 
  }
 
}
 
Collections.sort(groceryTransactions, new Comparator(){
 
  public int compare(Transaction t1, Transaction t2){
 
    return t2.getValue().compareTo(t1.getValue());
 
  }
 
});
 
List<Integer> transactionIds = new ArrayList<>();
 
for(Transaction t: groceryTransactions){
 
  transactionsIds.add(t.getId());
 
}

而在Java 8使用Stream:

?
1
2
3
4
5
6
7
8
9
10
11
List<Integer> transactionsIds =
 
    transactions.stream()
 
                .filter(t -> t.getType() == Transaction.GROCERY)
 
                .sorted(comparing(Transaction::getValue).reversed())
 
                .map(Transaction::getId)
 
                .collect(toList());

我們首先從交易數據列表中獲得一個stream對象,這是通過使用Liststream()方法實現的,下一步幾個操作 (filter, sorted, map, collect)是以鏈式排列成一個管道,形成對數據的查詢操作。

用Java8 stream處理數據

那么這段代碼如何并行操作呢?那么只要更換transactions.stream()transaction.parallelStream()即可,請注意lambda表達式(t-> t.getCategory() == Transaction.GROCERY)和方法引用(Transaction::getId)將在下一章詳細講解。

2、Stream起步

首先,定義一下StreamStream是一個來自支持聚合操作源的元素的序列。

如下特點:

  1. 1. 所謂元素的序列,一個Stream向外提供了一個這樣的接口:特定元素類型的值的序列,但是Stream并不實際持有也就是存儲這些元素,它們是在有需求時才會被計算。
  2. 2. 源:以提供Stream進行計算消費的源,這些源有Collection集合 Array數組或I/O資源等。
  3. 3.聚合操作:Stream支持類似SQL操作和函數式編程的大部分操作,比如:filter, map, reduce, find, match, sorted。

此外,Stream操作不同于Collection操作有兩個根本的地方:

  • 1.管道Pipelining: 許多流Stream操作返回流Stream自身,這就允許對其操作可以像鏈條一樣排列,變成一個管道,這其中也會激活比如懶加載和short-circuiting操作。
  • 2.內部迭代:相比于集合Collection是顯式迭代(需要我們編碼完成迭代),Stream操作是在其內部完成迭代操作。

下面我們看看前面Stream代碼的內部工作流程:

用Java8 stream處理數據

我們首先從交易transactions這個列表中獲得Stream對象,數據源就是交易列表,其中提供了一系列元素集合,這些元素都是供Stream操作的,下一步,我們使用了一系列對這個Stream的聚合操作,包括過濾filter (用我們指定的謂詞條件predicate過濾元素,也就是代碼t -> t.getType() == Transaction.GROCERY), 排序(用指定的比較器comparator對元素進行排序), 以及 map (為了釋放獲取信息). 所有這些操作除了最后的collect操作,都是返回一個Stream對象,這樣就能被前后鏈接在一起變成一個長的管道,可以看成是基于源數據集合的一個查詢操作。如同SQL基于數據表的有條件查詢語句一樣。

最后到collect被調用操作, collect操作開始處理這個管道以返回一個結果,不再是一個結果流了,這里一個結果是List一個對象,我們看到collect接受一個recipe輸入函數然后累計Stream中元素到一個匯總結果,這里輸入函數是toList(),它是一個將將Stream轉換為List對象。

3、Stream與Collection比較

StreamCollection集合有什么區別?Collection是關于靜止的數據結構,而Stream是有關動詞算法和計算的。前者是主要面向內存,存儲在內存中,后者主要是面向CPU,通過CPU實現計算的。

舉例將一個影片存儲在DVD盤上,這是一個集合,因為它包含整個電影的字節數據結構,而這個影片被放在互聯網上,我們通過視頻軟件去觀看它時,它實際是被流化了,它變成了一個字節流,流是與時間有關的概念,而數據結構是與時間無關,不會隨著時間變化變化,流正好相反,隨著時間不斷地動態變化,如同水流一樣潺潺不斷。

所以,集合與流的主要區別是是否需要被計算,集合是一個內存數據結構,集合中每個元素在加入到集合之前已經被計算了,相反,流是在即時要求即時計算。

使用集合需要開發者主動去遍歷,使用一個遍歷循環,這稱為外部遍歷。

而使用一個流庫使用內部遍歷,它自己為你遍歷元素,然后將結果保存在某處,你只要提供一個函數,它就會用這個函數對元素處理完成。內外遍歷的區別如下代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
List<String> transactionIds = new ArrayList<>();
 
for(Transaction t: transactions){
 
    transactionIds.add(t.getId()); //外部遍歷
 
}
 
 
 
List<Integer> transactionIds =
 
    transactions.stream()
 
                .map(Transaction::getId) //內部遍歷
 
                .collect(toList());

到此這篇關于用Java8 stream處理數據的文章就介紹到這了,更多相關 stream處理數據內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.jdon.com/idea/java/java8-stream.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久热人人综合人人九九精品视频 | 91精品国产高清久久久久 | sao虎在线精品永久在线 | 九九成人免费视频 | 91制片厂制作果冻传媒123 | 欧美香蕉人人人人人人爱 | 亚洲国产成人超福利久久精品 | 国产良家| 好爽好深好猛好舒服视频上 | 999资源站 | 日韩在线观看一区二区不卡视频 | 青青青在线观看国产精品 | 欧美日韩国产在线人成dvd | 2019理论韩国理论中文 | 日本人成大片在线 | 99这里只有精品视频 | 韩国情事伦理片观看地址 | 欧美高清在线精品一区 | 99久久精品免费看国产高清 | 成人网视频免费播放 | 欧美日韩精品免费一区二区三区 | ai换脸明星专区在线观看 | 国产第2页 | 福利片成人午夜在线 | 日本成年片高清在线观看 | 日韩色在线观看 | 叛佛 作者满栀小说免费阅读 | 久久免费看少妇高潮A片2012 | 999热在线精品观看全部 | 97香蕉超级碰碰碰久久兔费 | 四虎永久免费地址ww417 | 五月天色小说 | 波多野结衣在线中文字幕 | 1769在线观看 | 91精品综合国产在线观看 | 99久久精品国产免看国产一区 | 奇米影视99 | 放荡警察巨r麻麻出轨小说 范冰冰特黄xx大片 饭冈加奈子在线播放观看 法国老妇性xx在线播放 | 亚洲精品丝袜在线一区波多野结衣 | 97色资源| 国内精品国语自产拍在线观看55 |