日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1.14 Stream操作Collection集合

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.14 Stream操作Collection集合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Java 8新增的Stream操作Collection集合

Java 8 還新增了 Stream、IntStream、LongStream、DoubleStream 等流式 API,這些 API 代表多個支持串行和并行聚集操作的元素。上面 4 個接口中,Stream 是一個通用的流接口,而 IntStream、LongStream、 DoubleStream 則代表元素類型為 int、long、double 的流。

Java 8 還為上面每個流式 API 提供了對應的 Builder,例如 Stream.Builder、IntStream.Builder、LongStream.Builder、DoubleStream.Builder,開發者可以通過這些 Builder 來創建對應的流。

獨立使用 Stream 的步驟如下:

  • 使用 Stream 或 XxxStream 的 builder() 類方法創建該 Stream 對應的 Builder。
  • 重復調用 Builder 的 add() 方法向該流中添加多個元素。
  • 調用 Builder 的 build() 方法獲取對應的 Stream。
  • 調用 Stream 的聚集方法。
  • 在上面 4 個步驟中,第 4 步可以根據具體需求來調用不同的方法,Stream 提供了大量的聚集方法供用戶調用,具體可參考 Stream 或 XxxStream 的 API 文檔。對于大部分聚集方法而言,每個 Stream 只能執行一次。例如如下程序。

    public class IntStreamTest {public static void main(String[] args) {IntStream is = IntStream.builder().add(20).add(13).add(-2).add(18).build();// 下面調用聚集方法的代碼每次只能執行一行System.out.println("is 所有元素的最大值:" + is.max().getAsInt());System.out.println("is 所有元素的最小值:" + is.min().getAsInt());System.out.println("is 所有元素的總和:" + is.sum());System.out.println("is 所有元素的總數:" + 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映射成一個新Stream,新Stream的每個元素是原Stream元素的2倍+1IntStream newIs = is.map(ele -> ele * 2 + 1);// 使用方法引用的方式來遍歷集合元素newIs.forEach(System.out::println); // 輸岀 41 27 -3 37} }

    上面程序先創建了一個 IntStream,接下來分別多次調用 IntStream 的聚集方法執行操作,這樣即可獲取該流的相關信息。注意:上面 5~13 行代碼每次只能執行一行,因此需要把其他代碼注釋掉。

    Stream 提供了大量的方法進行聚集操作,這些方法既可以是“中間的”(intermediate),也可以是 “末端的”(terminal)。

    • 中間方法:中間操作允許流保持打開狀態,并允許直接調用后續方法。上面程序中的 map() 方法就是中間方法。中間方法的返回值是另外一個流。
    • 末端方法:末端方法是對流的最終操作。當對某個 Stream 執行末端方法后,該流將會被“消耗”且不再可用。上面程序中的
      sum()、count()、average() 等方法都是末端方法。

    除此之外,關于流的方法還有如下兩個特征。

    • 有狀態的方法:這種方法會給流增加一些新的屬性,比如元素的唯一性、元素的最大數量、保證元素以排序的方式被處理等。有狀態的方法往往需要更大的性能開銷。
    • 短路方法:短路方法可以盡早結束對流的操作,不必檢查所有的元素。

    下面簡單介紹一下 Stream 常用的中間方法。

    下面簡單介紹一下 Stream 常用的末端方法。

    除此之外,Java 8 允許使用流式 API 來操作集合,Collection 接口提供了一個 stream() 默認方法,該方法可返回該集合對應的流,接下來即可通過流式 API 來操作集合元素。由于 Stream 可以對集合元素進行整體的聚集操作,因此 Stream 極大地豐富了集合的功能。

    例如,對于《Predicate操作collection集合》一節的示例程序需要額外定義一個 calAll() 方法來遍歷集合元素,然后依次對每個集合元素進行判斷,這樣做太麻煩了。如果使用 Stream 可以直接對集合中所有的元素進行批量操作。下面使用 Stream 來改寫這個程序。

    public class CollectionStream {public static void main(String[] args) {// 創建一個集合Collection objs = new HashSet();objs.add(new String("C語言中文網Java教程"));objs.add(new String("C語言中文網C++教程"));objs.add(new String("C語言中文網C語言教程"));objs.add(new String("C語言中文網Python教程"));objs.add(new String("C語言中文網Go教程"));// 統計集合中出現“C語言中文網”字符串的數量System.out.println(objs.stream().filter(ele -> ((String) ele).contains("C語言中文網")).count()); // 輸出 5// 統計集合中出現“Java”字符串的數量System.out.println(objs.stream().filter(ele -> ((String) ele).contains("Java")).count()); // 輸出 1// 統計集合中出現字符串長度大于 12 的數量System.out.println(objs.stream().filter(ele -> ((String) ele).length() > 12).count()); // 輸出 1// 先調用Collection對象的stream ()方法將集合轉換為Stream// 再調用Stream的mapToInt()方法獲取原有的Stream對應的IntStreamobjs.stream().mapToInt(ele -> ((String) ele).length())// 調用forEach()方法遍歷IntStream中每個元素.forEach(System.out::println);// 輸出 11 11 12 10 14} }

    輸出結果為:

    5 1 1 11 11 12 10 14

    從上面代碼第 11~20 行可以看出,程序只要調用 Collection 的 stream() 方法即可返回該集合對應的 Stream,接下來就可通過 Stream 提供的方法對所有集合元素進行處理,這樣大大地簡化了集合編程的代碼,這也是 Stream 編程帶來的優勢。

    上面程序中第 18 行代碼先調用 Collection 對象的 stream() 方法將集合轉換為 Stream 對象,然后調用 Stream 對象的 mapToInt() 方法將其轉換為 IntStream 這個 mapToInt。方法就是一個中間方法,因此程序可繼續調用 IntStream 的 forEach() 方法來遍歷流中的元素。

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的1.14 Stream操作Collection集合的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。