1. 程式人生 > >Java8-Stream語法詳解

Java8-Stream語法詳解

1. Stream初體驗

我們先來看看Java裡面是怎麼定義Stream的:

A sequence of elements supporting sequential and parallel aggregate operations.

我們來解讀一下上面的那句話:

  1. Stream是元素的集合,這點讓Stream看起來用些類似Iterator;
  2. 可以支援順序和並行的對原Stream進行匯聚的操作;

大家可以把Stream當成一個高階版本的Iterator。原始版本的Iterator,使用者只能一個一個的遍歷元素並對其執行某些操作;高階版本的Stream,使用者只要給出需要對其包含的元素執行什麼操作,比如“過濾掉長度大於10的字串”、“獲取每個字串的首字母”等,具體這些操作如何應用到每個元素上,就給Stream就好了!(這個祕籍,一般人我不告訴他:))

大家看完這些可能對Stream還沒有一個直觀的認識,莫急,咱們來段程式碼。

1 //Lists是Guava中的一個工具類
2 List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6);
3 nums.stream().filter(num -> num != null).count();

上面這段程式碼是獲取一個List中,元素不為null的個數。這段程式碼雖然很簡短,但是卻是一個很好的入門級別的例子來體現如何使用Stream,正所謂“麻雀雖小五臟俱全”。我們現在開始深入解刨這個例子,完成以後你可能可以基本掌握Stream的用法!

1.1 剖析Stream通用語法

圖片就是對於Stream例子的一個解析,可以很清楚的看見:原本一條語句被三種顏色的框分割成了三個部分。紅色框中的語句是一個Stream的生命開始的地方,負責建立一個Stream例項;綠色框中的語句是賦予Stream靈魂的地方,把一個Stream轉換成另外一個Stream,紅框的語句生成的是一個包含所有nums變數的Stream,進過綠框的filter方法以後,重新生成了一個過濾掉原nums列表所有null以後的Stream;藍色框中的語句是豐收的地方,把Stream的裡面包含的內容按照某種演算法來匯聚成一個值,例子中是獲取Stream中包含的元素個數。如果這樣解析以後,還不理解,那就只能動用“核武器”–圖形化,一圖抵千言!

在此我們總結一下使用Stream的基本步驟:

  1. 建立Stream;
  2. 轉換Stream,每次轉換原有Stream物件不改變,返回一個新的Stream物件(**可以有多次轉換**);
  3. 對Stream進行聚合(Reduce)操作,獲取想要的結果;

2. 建立Stream

最常用的建立Stream有兩種途徑:

  1. 通過Stream介面的靜態工廠方法(注意:Java8裡介面可以帶靜態方法);
  2. 通過Collection介面的預設方法(預設方法:Default method,也是Java8中的一個新特性,就是介面中的一個帶有實現的方法,後續文章會有介紹)–stream(),把一個Collection物件轉換成Stream

2.1 使用Stream靜態方法來建立Stream

1. of方法:有兩個overload方法,一個接受變長引數,一個介面單一值

1 Stream<Integer> integerStream = Stream.of(1235);
2 Stream<String> stringStream = Stream.of("taobao");

2. generator方法:生成一個無限長度的Stream,其元素的生成是通過給定的Supplier(這個介面可以看成一個物件的工廠,每次呼叫返回一個給定型別的物件)

1 Stream.generate(new Supplier<Double>() {
2 @Override
3 public Double get() {
4 return Math.random();

相關推薦

Java8 Stream語法 不用迴圈

1. Stream初體驗 我們先來看看Java裡面是怎麼定義Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我們來解讀一下上面的那句話:

Java8-Stream語法

1. Stream初體驗 我們先來看看Java裡面是怎麼定義Stream的: A sequence of elements supporting sequential and parallel aggregate operations.

Java8初體驗(二)Stream語法

感謝同事【天錦】的投稿。投稿請聯絡 [email protected] 上篇文章Java8初體驗(一)lambda表示式語法比較詳細的介紹了lambda表示式的方方面面,細心的讀者會發現那篇文章的例子中有很多Stream的例子。這些Stream的例子可能讓你產生疑惑,本文將會詳細講解

Java8體驗(二)Stream語法

1. Stream初體驗 我們先來看看Java裡面是怎麼定義Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我們來解

Java8學習筆記(五)--Stream API[轉]

有效 編程效率 實時處理 phaser 綜合 files -- bin 並發模式 為什麽要使用StreamStream 作為 Java 8 的一大亮點,它與 java.io 包裏的 InputStream 和 OutputStream 是完全不同的概念。它也不同於 StAX

Java8Stream

首先,Stream流有一些特性: Stream流不是一種資料結構,不儲存資料,它只是在原資料集上定義了一組操作。 這些操作是惰性的,即每當訪問到流中的一個元素,才會在此元素上執行這一系列操作。 Stream不儲存資料,故每個Stream流只能使用一次。

Java 8系列之Stream的基本語法

Stream系列: 概述 繼Java 8系列之Lambda表示式之後,我們來了解Stream。Stream 是用函數語言程式設計方式在集合類上進行復雜操作的工具,其集成了Java 8中的眾多新特性之一的聚合操作,開發者可以更容易地使用Lambda表示

Java8中的Stream API:Stream的背景及使用

摘要:      Stream是Java8的一大亮點,是對容器物件功能的增強,它專注於對容器物件進行各種非常便利、高效的 聚合操作(aggregate operation)或者大批量資料操作。Stream API藉助於同樣新出現的Lambda表示式,極大的提

008-Hadoop Hive sql語法3-DML 操作:元數據存儲

pan 查詢 寫入 所有 not insert語句 int 寫入文件 文件系統 一、概述 hive不支持用insert語句一條一條的進行插入操作,也不支持update操作。數據是以load的方式加載到建立好的表中。數據一旦導入就不可以修改。 DML包括:INSERT插入

Oracle create tablespace 創建表空間語法

系統回滾段 語法 判斷 臨時 extent 數值 off offline 文件的 CREATE [UNDO] TABLESPACE tablespace_name [DATAFILE datefile_spec1 [,datefile_spec2] ..

mysql-5.7.9 shutdown 語法

resp 登錄 ive conn denied 權限不足 這樣的 fec comm mysql-5.7.9 終於提供shutdown 語法啦:   之前如果想關閉一個mysql數據庫可以通過kill 命令、mysqladmin shutdown 、service mysql

[持續交付實踐] pipeline:pipeline 使用之語法

安裝工具 詳細 href 3.0 def 實現 能夠 action roo 一、引言 jenkins pipeline語法的發展如此之快用日新月異來形容也不為過,而目前國內對jenkins pipeline關註的人還非常少,相關的文章更是稀少,唯一看到w3c有篇相關的估計是

Nginx Rewrite語法

服務器端 .html use rgs args port 資源 如果 urn 重寫中用到的指令 if (條件) {} 設定條件,再進行重寫 set #設置變量 return #返回狀態碼 break #跳出rewrite rewrite #重寫 If 語法格式 If

017-Hadoop Hive sql語法7-去重排序、數據傾斜

col 去重排序 sel cluster 可能 更多 分發 指定 clust 一、數據去重排序 1.1、去重   distinct與group by   盡量避免使用distinct進行排重,特別是大表操作,用group by代替   -- 不建議 selec

016-Hadoop Hive sql語法6-job輸入輸出優化、數據剪裁、減少job數、動態分區

分享 hive table 取數 nbsp put union 正在 style 一、job輸入輸出優化 善用muti-insert、union all,不同表的union all相當於multiple inputs,同一個表的union all,相當map一次輸出多條

(4)Smali系列學習之Smali語法內部類

這一 數字 學習 get 私有方法 如果 單獨 hello 我們 在這一節,我們來介紹一下內部類。對於Java文件中的每一個內部類,都會產生一個單獨的smali文件,比如ActivityThread$1.smali。這些文件的命名規範是如果是匿名內部類,則命名規則是外部類+

jdk1.8 java.util.stream.Stream

-c 打印 而不是 oid ole 表達 ice java-8 java 8 為什麽需要 Stream Stream 作為 Java 8 的一大亮點,它與 java.io 包裏的 InputStream 和 OutputStream 是完全不同的概念。它也不同於 StAX

Shodan的http.favicon.hash語法

簡單 tar 地址 字段 就是 mpi 舉例 數值 sts   在Shodan搜索中有一個關於網站icon圖標的搜索語法,http.favicon.hash,我們可以使用這個語法來搜索出使用了同一icon圖標的網站,不知道怎麽用的朋友請參考我上一篇文章。   通過上一篇文章

Android.mk 文件語法

too itl 其他 國內 fine 鏈接 sina 流程詳解 img Android.mk 文件語法詳解 轉:http://blog.sina.com.cn/s/blog_602f8770010148ce.html =========================

Jenkins pipeline 語法

數列 自定義 為什麽 box catcher k8s fork dom choice 原文地址http://www.cnblogs.com/fengjian2016/p/8227532.html pipeline 是一套運行於jenkins上的工作流框架,將原本獨立運行於單