成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《java 8 實戰(zhàn)》讀書筆記 -第四章 引入流

jeyhan / 3186人閱讀

摘要:第四章引入流一什么是流流是的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合通過查詢語句來表達,而不是臨時編寫一個實現(xiàn)。

第四章 引入流 一、什么是流
流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達,而不是臨時編寫一個實現(xiàn))。就現(xiàn)在來說,你可以把它們看成遍歷數(shù)據(jù)集的高級迭代器。此外,流還可以透明地并行處理,你無需寫任何多線程代碼。

下面兩段代碼都是用來返回低熱量的菜肴名稱的,并按照卡路里排序,一個是用Java 7寫的,另一個是用Java 8的流寫的。

之前(Java 7):

List lowCaloricDishes = new ArrayList<>(); 
for(Dish d: menu){ 
 if(d.getCalories() < 400){ 
 lowCaloricDishes.add(d); 
 } 
} 
Collections.sort(lowCaloricDishes, new Comparator() {
 public int compare(Dish d1, Dish d2){ 
 return Integer.compare(d1.getCalories(), d2.getCalories()); 
 } 
}); 
List lowCaloricDishesName = new ArrayList<>(); 
for(Dish d: lowCaloricDishes){ 
 lowCaloricDishesName.add(d.getName()); 
} 

在這段代碼中,你用了一個“垃圾變量”lowCaloricDishes。它唯一的作用就是作為一次
性的中間容器。在Java 8中,實現(xiàn)的細節(jié)被放在它本該歸屬的庫里了。

之后(Java 8):

import static java.util.Comparator.comparing; 
import static java.util.stream.Collectors.toList; 
List lowCaloricDishesName = 
 menu.stream() 
 .filter(d -> d.getCalories() < 400) 
 .sorted(comparing(Dish::getCalories))
 .map(Dish::getName) 
 .collect(toList()); 

為了利用多核架構并行執(zhí)行這段代碼,你只需要把stream()換成parallelStream()

List lowCaloricDishesName = 
 menu.parallelStream() 
 .filter(d -> d.getCalories() < 400) 
 .sorted(comparing(Dishes::getCalories)) 
 .map(Dish::getName) 
 .collect(toList()); 

按照Map里面的類別對菜肴進行分組。

Map> dishesByType = menu.stream().collect(groupingBy(Dish::getType)); 
其他庫:Guava、Apache和lambdaj 
為了給Java程序員提供更好的庫操作集合,前人已經(jīng)做過了很多嘗試。比如,Guava就是谷歌創(chuàng)建的一個很流行的庫。它提供了multimaps和multisets等額外的容器類。Apache Commons Collections庫也提供了類似的功能。Mario Fusco編寫的lambdaj受到函數(shù)式編程的啟發(fā),也提供了很多聲明性操作集合的工具。

流到底是什么呢?簡短的定義就是“從支持數(shù)據(jù)處理操作的源生成的元素序列”。

元素序列——就像集合一樣,流也提供了一個接口,可以訪問特定元素類型的一組有序值。因為集合是數(shù)據(jù)結構,所以它的主要目的是以特定的時間/空間復雜度存儲和訪問元素(如ArrayList 與 LinkedList)。但流的目的在于表達計算,比如你前面見到的filter、sorted和map。集合講的是數(shù)據(jù),流講的是計算。我們會在后面幾節(jié)中詳細解釋這個思想。

——流會使用一個提供數(shù)據(jù)的源,如集合、數(shù)組或輸入/輸出資源。 請注意,從有序集合生成流時會保留原有的順序。由列表生成的流,其元素順序與列表一致。

數(shù)據(jù)處理操作——流的數(shù)據(jù)處理功能支持類似于數(shù)據(jù)庫的操作,以及函數(shù)式編程語言中的常用操作,如filter、map、reduce、find、match、sort等。流操作可以順序執(zhí)行,也可并行執(zhí)行。

eg: 選出3條卡路里高于300的菜肴的菜肴的名字

import static java.util.stream.Collectors.toList; 
List threeHighCaloricDishNames = 
 menu.stream() 
 .filter(d -> d.getCalories() > 300)
 .map(Dish::getName)
 .limit(3)         //篩選(filter)、提?。╩ap)或截斷(limit)
 .collect(toList()); 
System.out.println(threeHighCaloricDishNames); 
//在調(diào)用collect之前,沒有任何結果產(chǎn)生,實際上根本就沒有從menu里選擇元素
二、流與集合

和迭代器類似,流只能遍歷一次。遍歷完之后,我們就說這個流已經(jīng)被消費掉了。

使用Collection接口需要用戶去做迭代(比如用for-each),這稱為外部迭代。 相反,Streams庫使用內(nèi)部迭代——它幫你把迭代做了,還把得到的流值存在了某個地方,你只要給出一個函數(shù)說要干什么就可以了。

三、流操作

java.util.stream.Stream中的Stream接口定義了許多操作。它們可以分為兩大類:

中間操作
可以連接起來的流操作稱為中間操作,諸如filter或sorted等

終端操作
關閉流的操作稱為終端操作,其結果是任何不是流的值,比如List、Integer,甚至void

eg:(注意循環(huán)合并)

    List names = 
     menu.stream() 
     .filter(d -> { 
     System.out.println("filtering" + d.getName()); 
     return d.getCalories() > 300; 
     }) 
     .map(d -> { 
     System.out.println("mapping" + d.getName()); 
     return d.getName(); 
     }) 
     .limit(3) 
     .collect(toList()); 
    System.out.println(names);

此代碼執(zhí)行時將打?。?/p>

    filtering pork 
    mapping pork 
    filtering beef 
    mapping beef 
    filtering chicken 
    mapping chicken 
    [pork, beef, chicken] 

盡管filter和map是兩個獨立的操作,但它們合并到同一次遍歷中了(我們把這種技術叫作循環(huán)合并)。

四、使用流

流的使用一般包括三件事:

一個數(shù)據(jù)源(如集合)來執(zhí)行一個查詢;

一個中間操作鏈,形成一條流的流水線;

一個終端操作,執(zhí)行流水線,并能生成結果。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77531.html

相關文章

  • Java8實戰(zhàn)》-讀書筆記第一章(02)

    摘要:實戰(zhàn)讀書筆記第一章從方法傳遞到接著上次的,繼續(xù)來了解一下,如果繼續(xù)簡化代碼。去掉并且生成的數(shù)字是萬,所消耗的時間循序流并行流至于為什么有時候并行流效率比循序流還低,這個以后的文章會解釋。 《Java8實戰(zhàn)》-讀書筆記第一章(02) 從方法傳遞到Lambda 接著上次的Predicate,繼續(xù)來了解一下,如果繼續(xù)簡化代碼。 把方法作為值來傳遞雖然很有用,但是要是有很多類似與isHeavy...

    lushan 評論0 收藏0
  • java 8 實戰(zhàn)讀書筆記 -第五章 使用

    摘要:比如,你可以建立一個,選出熱量超過卡路里的頭三道菜請注意也可以用在無序流上,比如源是一個。跳過元素流還支持方法,返回一個扔掉了前個元素的流。一般來說,應該使用來對這種流加以限制,以避免打印無窮多個值。 一、篩選和切片 1.用謂詞篩選 Streams接口支持filter方法。該操作會接受一個謂詞(一個返回boolean的函數(shù))作為參數(shù),并返回一個包括所有符合謂詞的元素的流。例如篩選出所有...

    Richard_Gao 評論0 收藏0
  • java 8 實戰(zhàn)讀書筆記 -第七章 并行數(shù)據(jù)處理與性能

    摘要:正確使用并行流錯用并行流而產(chǎn)生錯誤的首要原因,就是使用的算法改變了某些共享狀態(tài)。高效使用并行流留意裝箱有些操作本身在并行流上的性能就比順序流差還要考慮流的操作流水線的總計算成本。 一、并行流 1.將順序流轉(zhuǎn)換為并行流 對順序流調(diào)用parallel方法: public static long parallelSum(long n) { return Stream.iterate(1L...

    劉福 評論0 收藏0
  • Java8實戰(zhàn)》-第五章讀書筆記(使用Stream-01)

    摘要:跳過元素流還支持方法,返回一個扔掉了前個元素的流。歸約到目前為止,我們見到過的終端操作都是返回一個之類的或?qū)ο蟮?。這樣的查詢可以被歸類為歸約操作將流歸約成一個值。通過反復使用加法,你把一個數(shù)字列表歸約成了一個數(shù)字。 使用流 在上一篇的讀書筆記中,我們已經(jīng)看到了流讓你從外部迭代轉(zhuǎn)向內(nèi)部迭代。這樣,你就用不著寫下面這樣的代碼來顯式地管理數(shù)據(jù)集合的迭代(外部迭代)了: /** * 菜單 ...

    OldPanda 評論0 收藏0
  • Java8實戰(zhàn)》-第六章讀書筆記(用收集數(shù)據(jù)-01)

    摘要:收集器用作高級歸約剛剛的結論又引出了優(yōu)秀的函數(shù)式設計的另一個好處更易復合和重用。更具體地說,對流調(diào)用方法將對流中的元素觸發(fā)一個歸約操作由來參數(shù)化。另一個常見的返回單個值的歸約操作是對流中對象的一個數(shù)值字段求和。 用流收集數(shù)據(jù) 我們在前一章中學到,流可以用類似于數(shù)據(jù)庫的操作幫助你處理集合。你可以把Java 8的流看作花哨又懶惰的數(shù)據(jù)集迭代器。它們支持兩種類型的操作:中間操作(如 filt...

    EscapedDog 評論0 收藏0
  • Java并發(fā)編程實戰(zhàn)讀書筆記-第1章 簡介

    摘要:線程允許同一個進程中同時存在多個程序控制流。線程也被稱為輕量級進程?,F(xiàn)代操作系統(tǒng)中,都是以線程為基本的調(diào)度單位,而不是進程。 并發(fā)簡史 在早期的計算機中不包含操作系統(tǒng),從頭至尾都只執(zhí)行一個程序,并且這個程序能訪問計算機所有資源。操作系統(tǒng)的出現(xiàn)使得計算機每次能運行多個程序,并且不同的程序都在單獨的進程中運行:操作系統(tǒng)為各個獨立執(zhí)行的進程分配內(nèi)存、文件句柄、安全證書等。不同進程之間通過一些...

    zhoutk 評論0 收藏0

發(fā)表評論

0條評論

jeyhan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<