国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

《java 8 實戰》讀書筆記 -第四章 引入流

jeyhan / 3153人閱讀

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

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

下面兩段代碼都是用來返回低熱量的菜肴名稱的,并按照卡路里排序,一個是用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中,實現的細節被放在它本該歸屬的庫里了。

之后(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()); 

為了利用多核架構并行執行這段代碼,你只需要把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程序員提供更好的庫操作集合,前人已經做過了很多嘗試。比如,Guava就是谷歌創建的一個很流行的庫。它提供了multimaps和multisets等額外的容器類。Apache Commons Collections庫也提供了類似的功能。Mario Fusco編寫的lambdaj受到函數式編程的啟發,也提供了很多聲明性操作集合的工具。

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

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

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

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

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)、提取(map)或截斷(limit)
 .collect(toList()); 
System.out.println(threeHighCaloricDishNames); 
//在調用collect之前,沒有任何結果產生,實際上根本就沒有從menu里選擇元素
二、流與集合

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

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

三、流操作

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

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

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

eg:(注意循環合并)

    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);

此代碼執行時將打印:

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

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

四、使用流

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

一個數據源(如集合)來執行一個查詢;

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77531.html

相關文章

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

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

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

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

    Richard_Gao 評論0 收藏0
  • java 8 實戰讀書筆記 -第七章 并行數據處理與性能

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

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

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

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

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

    EscapedDog 評論0 收藏0
  • Java并發編程實戰讀書筆記-第1章 簡介

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

    zhoutk 評論0 收藏0

發表評論

0條評論

jeyhan

|高級講師

TA的文章

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