1.14 Stream操作Collection集合
使用Java 8新增的Stream操作Collection集合
Java 8 還新增了 Stream、IntStream、LongStream、DoubleStream 等流式 API,這些 API 代表多個(gè)支持串行和并行聚集操作的元素。上面 4 個(gè)接口中,Stream 是一個(gè)通用的流接口,而 IntStream、LongStream、 DoubleStream 則代表元素類型為 int、long、double 的流。
Java 8 還為上面每個(gè)流式 API 提供了對(duì)應(yīng)的 Builder,例如 Stream.Builder、IntStream.Builder、LongStream.Builder、DoubleStream.Builder,開發(fā)者可以通過這些 Builder 來創(chuàng)建對(duì)應(yīng)的流。
獨(dú)立使用 Stream 的步驟如下:
在上面 4 個(gè)步驟中,第 4 步可以根據(jù)具體需求來調(diào)用不同的方法,Stream 提供了大量的聚集方法供用戶調(diào)用,具體可參考 Stream 或 XxxStream 的 API 文檔。對(duì)于大部分聚集方法而言,每個(gè) Stream 只能執(zhí)行一次。例如如下程序。
public class IntStreamTest {public static void main(String[] args) {IntStream is = IntStream.builder().add(20).add(13).add(-2).add(18).build();// 下面調(diào)用聚集方法的代碼每次只能執(zhí)行一行System.out.println("is 所有元素的最大值:" + is.max().getAsInt());System.out.println("is 所有元素的最小值:" + is.min().getAsInt());System.out.println("is 所有元素的總和:" + is.sum());System.out.println("is 所有元素的總數(shù):" + is.count());System.out.println("is 所有元素的平均值:" + is.average());System.out.println("is所有元素的平方是否都大于20: " + is.allMatch(ele -> ele * ele > 20));System.out.println("is是否包含任何元素的平方大于20 : " + is.anyMatch(ele -> ele * ele > 20));// 將is映射成一個(gè)新Stream,新Stream的每個(gè)元素是原Stream元素的2倍+1IntStream newIs = is.map(ele -> ele * 2 + 1);// 使用方法引用的方式來遍歷集合元素newIs.forEach(System.out::println); // 輸岀 41 27 -3 37} }上面程序先創(chuàng)建了一個(gè) IntStream,接下來分別多次調(diào)用 IntStream 的聚集方法執(zhí)行操作,這樣即可獲取該流的相關(guān)信息。注意:上面 5~13 行代碼每次只能執(zhí)行一行,因此需要把其他代碼注釋掉。
Stream 提供了大量的方法進(jìn)行聚集操作,這些方法既可以是“中間的”(intermediate),也可以是 “末端的”(terminal)。
- 中間方法:中間操作允許流保持打開狀態(tài),并允許直接調(diào)用后續(xù)方法。上面程序中的 map() 方法就是中間方法。中間方法的返回值是另外一個(gè)流。
- 末端方法:末端方法是對(duì)流的最終操作。當(dāng)對(duì)某個(gè) Stream 執(zhí)行末端方法后,該流將會(huì)被“消耗”且不再可用。上面程序中的
sum()、count()、average() 等方法都是末端方法。
除此之外,關(guān)于流的方法還有如下兩個(gè)特征。
- 有狀態(tài)的方法:這種方法會(huì)給流增加一些新的屬性,比如元素的唯一性、元素的最大數(shù)量、保證元素以排序的方式被處理等。有狀態(tài)的方法往往需要更大的性能開銷。
- 短路方法:短路方法可以盡早結(jié)束對(duì)流的操作,不必檢查所有的元素。
下面簡(jiǎn)單介紹一下 Stream 常用的中間方法。
下面簡(jiǎn)單介紹一下 Stream 常用的末端方法。
除此之外,Java 8 允許使用流式 API 來操作集合,Collection 接口提供了一個(gè) stream() 默認(rèn)方法,該方法可返回該集合對(duì)應(yīng)的流,接下來即可通過流式 API 來操作集合元素。由于 Stream 可以對(duì)集合元素進(jìn)行整體的聚集操作,因此 Stream 極大地豐富了集合的功能。
例如,對(duì)于《Predicate操作collection集合》一節(jié)的示例程序需要額外定義一個(gè) calAll() 方法來遍歷集合元素,然后依次對(duì)每個(gè)集合元素進(jìn)行判斷,這樣做太麻煩了。如果使用 Stream 可以直接對(duì)集合中所有的元素進(jìn)行批量操作。下面使用 Stream 來改寫這個(gè)程序。
public class CollectionStream {public static void main(String[] args) {// 創(chuàng)建一個(gè)集合Collection objs = new HashSet();objs.add(new String("C語言中文網(wǎng)Java教程"));objs.add(new String("C語言中文網(wǎng)C++教程"));objs.add(new String("C語言中文網(wǎng)C語言教程"));objs.add(new String("C語言中文網(wǎng)Python教程"));objs.add(new String("C語言中文網(wǎng)Go教程"));// 統(tǒng)計(jì)集合中出現(xiàn)“C語言中文網(wǎng)”字符串的數(shù)量System.out.println(objs.stream().filter(ele -> ((String) ele).contains("C語言中文網(wǎng)")).count()); // 輸出 5// 統(tǒng)計(jì)集合中出現(xiàn)“Java”字符串的數(shù)量System.out.println(objs.stream().filter(ele -> ((String) ele).contains("Java")).count()); // 輸出 1// 統(tǒng)計(jì)集合中出現(xiàn)字符串長(zhǎng)度大于 12 的數(shù)量System.out.println(objs.stream().filter(ele -> ((String) ele).length() > 12).count()); // 輸出 1// 先調(diào)用Collection對(duì)象的stream ()方法將集合轉(zhuǎn)換為Stream// 再調(diào)用Stream的mapToInt()方法獲取原有的Stream對(duì)應(yīng)的IntStreamobjs.stream().mapToInt(ele -> ((String) ele).length())// 調(diào)用forEach()方法遍歷IntStream中每個(gè)元素.forEach(System.out::println);// 輸出 11 11 12 10 14} }輸出結(jié)果為:
5 1 1 11 11 12 10 14
從上面代碼第 11~20 行可以看出,程序只要調(diào)用 Collection 的 stream() 方法即可返回該集合對(duì)應(yīng)的 Stream,接下來就可通過 Stream 提供的方法對(duì)所有集合元素進(jìn)行處理,這樣大大地簡(jiǎn)化了集合編程的代碼,這也是 Stream 編程帶來的優(yōu)勢(shì)。
上面程序中第 18 行代碼先調(diào)用 Collection 對(duì)象的 stream() 方法將集合轉(zhuǎn)換為 Stream 對(duì)象,然后調(diào)用 Stream 對(duì)象的 mapToInt() 方法將其轉(zhuǎn)換為 IntStream 這個(gè) mapToInt。方法就是一個(gè)中間方法,因此程序可繼續(xù)調(diào)用 IntStream 的 forEach() 方法來遍歷流中的元素。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的1.14 Stream操作Collection集合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.13 Predicate操作Coll
- 下一篇: 1.15 Java 9新增的不可变集合