在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Java的Stream的常用知識

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-11 15:45 ? 次閱讀

什么是Stream

生產線

Stream就像處理生產流水線一樣去工作,傳送帶就是Stream的管道,每個工廠關注直接的生產,將上游產品加工成下游需要的產品。為什么Stream比傳統的處理方式好呢?我們都知道,傳統的處理中,每一步我們都需要通過循環控制,邏輯控制,解包,重新裝箱這些工作。

圖片
非生產線示意處理圖

這些步驟讓我們的程序的業務邏輯支離破碎,經常處理數據類的小伙伴尤為痛苦。幸運的是,Java8為我們引入了Stream,使用Stream后我們只關注數據處理邏輯,其他的事情交給流處理對應的方法來完成。

創建數據流

指北君先為大家介紹如何創建Stream,這里有非常多的方式,需要注意一點就是:流一旦創建后,修改創建的源不會影響已經創建的Stream中的數據。

  1. 空流 為了避免出現空指針異常,系統提供一個靜態方法提供空流。
public void createStream() {
        Stream< String > myStream = Stream.empty();
    }
  1. 通過數組對象創建流
public void createStream() {
        Integer[] arr = new Integer[]{1,2,3};
        Stream< Integer > stream1 = Arrays.stream(arr);
        Stream< Integer > stream2 = Arrays.stream(arr, 0, 2);
    }
  1. 通過集合對象創建流
public void createStream() {
        Collection< String > collection = Arrays.asList("a", "b", "c");
        Stream< String > stream1 = collection.stream();
    }

支持多種集合:List,Set,Map等實現了Collection接口的集合對象。

  1. 通過builder創建
public void createStream() {
        Stream< Long > stream1 =
                  Stream.< Long >builder().add(1L).add(2L).add(3L).build();
    }
  1. 通過generate生成
public void createStream() {
        Random r = new Random();
        Stream< Long > stream =
                  Stream.generate(() - > r.nextLong()).limit(10);
    }

按照提供給generate的Supplier邏輯生成數據,通過limit限制生成的數據量

  1. 通過Stream.iterate創建
public void createStream() {
        Stream< Integer > stream = Stream.iterate(1, n - > n * n).limit(20);
    }

iterate提供兩種方法來滿足我們比較常用的迭代生成邏輯

  • iterate(final T seed, final UnaryOperatorf)
  • iterate(T seed, Predicate hasNext, UnaryOperatornext)
  1. 原生類型生成 通過對應的IntStream,LongStream,DoubleStream類中提供的方法來獲取,包含常用的方法
  • builder()
  • empty()
  • of()
  • iterate()
  • generate()
  • range()
  • concat()
  1. 其他地方 這里介紹兩處:字符分割匹配和文件行數據

String.chars()返回IntStream
Files.lines()返回通過行分割的字符內容

流的使用機制(重要事項)

我們通過上面的方法創建好流后,就可以對流進行相關的業務邏輯處理了,需要注意:如果我們重復對一個流進行操作,就會出錯,系統會爆出IllegalStateException異常,這是因為Stream設計為不可重用的模式。流的下一個環節都是對當前環節處理后新生成流的處理。

流的執行順序

采用Stream方式進行多個邏輯處理時,他們之間的執行順序是什么樣的呢?指北君為了展示效果,寫了一段測試代碼:

public void exeOrder() {
        List< String > list = Arrays.asList("data_1","data_2", "data_3", "data_12");
        list.stream().filter(x - > {
            System.out.println("filter() was called: " + x);
            return x.contains("2");
        }).map(x - > {
            System.out.println("map() was called: " + x);
            return x.toUpperCase();
        }).forEach(x- >System.out.println("forEach() was called: " + x));
    }

執行結果如下:
filter() was called: data_1
filter() was called: data_2
map() was called: data_2
forEach() was called: data_2
filter() was called: data_3
filter() was called: data_12
map() was called: data_12
forEach() was called: data_12

從示例代碼的打印的順序中我們可以發現:流處理的順序不是以代碼順序(執行完一步再到下一步),而是按照數據處理完一個單位數據的所有環節再處理下一個數據,見下面的動態示意圖:

圖片

Stream處理順序

既然我們了解流的處理順序,也能理解某些流操作會提前結束流處理的,比如findFirst(),在處理完第一個符合條件的數據后,后續的數據不會參與任何一個環節的處理。

轉換處理

轉換處理時最常用的邏輯處理方式,介紹轉換處理的文章較多,這里不再一一詳細描述只是簡單列一下,轉換處理對應大數據MapReduce中的Map處理

  1. distinct剔重
  2. filter過濾
  3. map轉換映射
  4. peek
  5. limit
  6. skip

合并處理(reduce)

對于Map-Reduce模型的reduce操作,國內對這個詞翻譯不太統一,指北君就先稱之為合并處理吧。這里介紹兩個方法reduce和collect

  1. reduce 先來看一個reduce的示例
public void reduce() {
        int sum = IntStream.range(1, 100).reduce(0, (a, b) - > a + b);
        System.out.print(sum);
    }

合并Stream中的所有值,合并的初始值為0,如果初始為0還可以省略初始值。reduce函數包含三部分關鍵信息

  • 初始值,指定合并操作的初始值
  • 合并函數
  • 合路器(函數),在并行(多線程)運算時需要用到

下面是一個使用合路器的示例,在并行運算時使用。

public void parallelReduce() {
        int sum = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).parallelStream()
                .reduce(0, (a, b) - > a + b, (a, b) - > {
                   return a + b;
                });
        System.out.println(sum);
    }

這里指北君留一道思考題給大家,如果這里初始值0修改為10,最終的結果是多少?為什么是這種結果呢?

  1. collect 現在我們再來看collect,collect嚴格上說是reduce有些牽強,因為是否reduce在于collect中的執行邏輯 比如這段:
List String > collector =  list.stream().map(Product::getName).collect(Collectors.toList());

然后再看下面的例子:

String mergString = list.stream().map(Product::getName).collect(Collectors.joining(", ", "[", "]"));

還有其他對應的方法:

  • Collectors.averagingInt
  • Collectors.summingInt
  • Collectors.groupingBy
  • Collectors.partitioningBy

各位小伙伴可以查看Collectors對應的API,這里就不一一列舉了,總之,collect通過Collectors對象的API類完成合并處理。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8600

    瀏覽量

    151166
  • JAVA
    +關注

    關注

    19

    文章

    2967

    瀏覽量

    104759
  • 字符
    +關注

    關注

    0

    文章

    233

    瀏覽量

    25210
  • 數據處理
    +關注

    關注

    0

    文章

    599

    瀏覽量

    28568
  • Stream
    +關注

    關注

    0

    文章

    20

    瀏覽量

    7983
收藏 人收藏

    評論

    相關推薦

    Stream模塊的基礎用法和進階用法

    在 Rust 語言中,Tokio 是一個非常流行的異步編程框架。它提供了一系列的模塊,其中最常用的就是 Stream 模塊。Stream 模塊允許我們以異步的方式處理數據流,這在很多情況下非常
    的頭像 發表于 09-19 15:33 ?1204次閱讀

    Stream API原理介紹

    Stream API 是 Java 8 中最重要的新特性之一,它是處理集合和數組的一種新方式。它提供了一種簡單、靈活和可讀的方式來處理集合和數組中的元素,從而使代碼更加簡潔、高效和易于維護。 1.
    的頭像 發表于 09-30 15:31 ?715次閱讀

    JAVA學習直通車(教程+書籍+100個實例+問題與解答)

    對于Java8的并行流并不陌生,沒錯,我們常常用它來執行并行任務,但是由于并行流(parallel stream)采用的是享線程池,可能會對我們的性能造成嚴重影響,那怎么處理呢?`
    發表于 10-25 14:35

    JAVA常用系統類的使用 實驗

    實驗 6 常用系統類的使用 一、實驗目的 了解 Java 常用的系統類,包括 Java Applet、字符串類、輸入輸出流類、數學函數類、日期類、隨機數類以及向量類等的基
    發表于 09-23 19:01 ?1749次閱讀

    Java常用工具類

    Java常用工具類。
    發表于 11-06 11:21 ?1次下載

    JAVA教程之常用圖形的繪制與填充

    JAVA教程之常用圖形的繪制與填充,很好的JAVA的資料,快來學習吧
    發表于 04-11 17:28 ?3次下載

    JAVA相關基礎知識

    JAVA相關基礎知識,感興趣的小伙伴們可以瞧一瞧。
    發表于 11-10 11:17 ?0次下載

    Java設計知識講解

    本文檔內容介紹了基于Java設計知識講解,供參考
    發表于 03-26 11:09 ?16次下載

    如何利用Stream API來優化Java代碼

    使用Stream API優化代碼 Java8的新特性主要是Lambda表達式和流,當流和Lambda表達式結合起來一起使用時,因為流申明式處理數據集合的特點,可以讓代碼變得簡潔易讀 放大招,流
    的頭像 發表于 07-26 14:30 ?1299次閱讀

    JDK8 Stream數據流效率分析

    StreamJava SE 8類庫中新增的關鍵抽象,它被定義于 java.util.stream (這個包里有若干流類型:Stream 代表對象引用流,此外還有一系列特化流,
    的頭像 發表于 08-17 10:53 ?1249次閱讀

    javastream編程調試技巧

      javastream編程給調試帶來了極大的不便,idea 推出了streamtrace功能,可以詳細看到每一步操作的關系、結果,非常方便進行調試。初遇StreamTrace這里簡單將字符串轉成它的字符數,并設置斷點開啟debug模式。
    的頭像 發表于 10-11 11:06 ?1589次閱讀

    淺析Stream里的隱式轉換

    Stream、Flow是在電路描述里經常用到的對象。
    的頭像 發表于 05-15 17:36 ?476次閱讀
    淺析<b class='flag-5'>Stream</b>里的隱式轉換

    怎么使用Java8的Stream API比較兩個List的差異呢?

    可以使用Java8的Stream API來比較兩個List的差異,并取出不同的對象。
    的頭像 發表于 08-12 11:15 ?2229次閱讀

    Java8的Stream流 map() 方法

    8 之后,對集合可以進行 Stream 操作,使上面的處理更簡潔。 概述 Stream 流式處理中有 map() 方法,先看下其定義,該方法在java.util.stream.Stream類中 可以看到
    的頭像 發表于 09-25 11:06 ?1872次閱讀
    <b class='flag-5'>Java</b>8的<b class='flag-5'>Stream</b>流 map() 方法

    java常用的包有哪些

    Java是一種面向對象的高級編程語言,它具有平臺無關性和可擴展性。Java中有很多常用的包,這些包提供了豐富的類庫和工具,用于開發各種類型的應用程序。下面是Java中一些
    的頭像 發表于 11-22 15:10 ?1461次閱讀
    主站蜘蛛池模板: 狠狠干狠狠艹| 在线观看黄a| 午夜一级| 天天干天天爱天天射| 欧美最猛黑人xxxx黑人猛交黄| xxxx性欧美极品另类| 亚洲国产综合久久精品| 狠狠色综合网| 国产自产视频在线观看香蕉| 最黄色的视频| 黄色网址在线免费观看| 国产一级特黄在线视频| 曰本在线| 成人亚洲欧美| 视频免费观看网址| 2019天天操| 天堂网2021天堂手机版丶| qyule亚洲精品| 中文字幕一区二区三区免费看 | 久久频这里精品99香蕉久网址| 天堂网www在线| a欧美视频| 人人插人人爱| 日日爱网址| 亚洲狠狠色丁香婷婷综合 | 妖精视频一区二区三区| 国产主播在线一区| 亚洲另类电击调教在线观看| 色婷婷5月精品久久久久| 午夜精品久久久久久影视riav| 男女视频在线观看| 色老头一区二区三区在线观看| 亚洲一区二区黄色| 免费一区二区| 国产成在线人视频免费视频| 女人69xxx| 天堂网bt| 日本全黄视频| 婷婷色在线观看| 天天操天天干天天拍| 夜色福利久久久久久777777|