<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java 8 流 API > 原文: [https://howtodoinjava.com/java8/java-streams-by-examples/](https://howtodoinjava.com/java8/java-streams-by-examples/) 可以將 Java 中的**流定義為源中支持其聚合操作的元素序列**。 此處的來源是指向流提供數據的[集合](https://howtodoinjava.com/java-collections/)或[數組](https://howtodoinjava.com/java-array/)。 流保持數據在源中的順序。 **聚合操作**或**批量操作**是使我們能夠輕松,清晰地表達對流元素的常用操作的操作。 ![java_8_lambdas](https://img.kancloud.cn/25/b0/25b0425e182a744e718ed5417a7958c8_230x229.png) ```java Table of Contents 1\. Streams vs. Collections 2\. Different ways to create streams 3\. Converting streams to collections 4\. Core stream operations 4.1\. Intermediate operations 4.2\. Terminal operations 5\. Short-circuit operations 6\. Parallelism ``` 在繼續之前,重要的是要了解 **Java 8 流**的設計方式是**大多數流操作僅返回流**。 這有助于我們創建流操作鏈。 這稱為**管道內襯**。 在這篇文章中,我將多次使用該術語,因此請牢記。 ## 1\. Java 流與集合 我們所有人都已經在 youtube 或其他此類網站上觀看了在線視頻。 當您開始觀看視頻時,文件的一小部分首先會加載到計算機中并開始播放。 開始播放之前,您無需下載完整的視頻。 這稱為流式傳輸。 我將嘗試將此概念與集合相關聯,并通過流進行區分。 在基本級別上,集合和流之間的差異與計算事物時有關。 **集合是內存中的數據結構**,它保存該數據結構當前具有的所有值-集合中的每個元素必須先計算,然后才能添加到集合中。 **流是概念上固定的數據結構,其中元素按需計算**。 這帶來了顯著的編程優勢。 想法是,用戶將僅從流中提取他們需要的值,并且僅在需要時才對用戶無形地生成這些元素。 這是生產者-消費者關系的一種形式。 在 java 中,`java.util.Stream`表示可以在其上執行一個或多個操作的流。 流**操作是中間或終止**。 盡管**終止操作返回某個類型**的結果,但是**中間操作返回流本身**,因此您可以連續鏈接多個方法調用。 流是在源上創建的,例如類似于列表或集合的`java.util.Collection`(不支持映射)。 流操作可以順序執行,也可以并行執行。 基于以上幾點,如果我們列出`Stream`的各種特征,它們將如下所示: * 不是數據結構 * 專為 lambdas 設計 * 不支持索引訪問 * 可以輕松輸出為數組或列表 * 支持延遲訪問 * 可并行化 ## 2\. 創建流的不同方法 以下是從集合構建流的最流行的不同方法。 #### 2.1 `Stream.of(val1, val2, val3 ....)` ```java public class StreamBuilders { public static void main(String[] args) { Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9); stream.forEach(p -> System.out.println(p)); } } ``` #### 2.2 `Stream.of(arrayOfElements)` ```java public class StreamBuilders { public static void main(String[] args) { Stream<Integer> stream = Stream.of( new Integer[]{1,2,3,4,5,6,7,8,9} ); stream.forEach(p -> System.out.println(p)); } } ``` #### 2.3\. `List.stream()` ```java public class StreamBuilders { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for(int i = 1; i< 10; i++){ list.add(i); } Stream<Integer> stream = list.stream(); stream.forEach(p -> System.out.println(p)); } } ``` #### 2.4 `Stream.generate()`或`Stream.iterate()` ```java public class StreamBuilders { public static void main(String[] args) { Stream<Date> stream = Stream.generate(() -> { return new Date(); }); stream.forEach(p -> System.out.println(p)); } } ``` #### 2.5 字符串字符或字符串標記 ```java public class StreamBuilders { public static void main(String[] args) { IntStream stream = "12345_abcdefg".chars(); stream.forEach(p -> System.out.println(p)); //OR Stream<String> stream = Stream.of("A$B$C".split("\\$")); stream.forEach(p -> System.out.println(p)); } } ``` 除了上述列表以外,還有其他一些方法,例如使用`Stream.Buider`或使用中間操作。 我們將不時在單獨的文章中了解它們。 ## 3\. 將流轉換為集合 我應該說將流轉換為其他數據結構。 請注意,這不是真正的轉換。 它只是將流中的元素收集到集合或數組中。 #### 3.1 將流轉換為列表 – `Stream.collect(Collectors.toList())` ```java public class StreamBuilders { public static void main(String[] args){ List<Integer> list = new ArrayList<Integer>(); for(int i = 1; i< 10; i++){ list.add(i); } Stream<Integer> stream = list.stream(); List<Integer> evenNumbersList = stream.filter(i -> i%2 == 0).collect(Collectors.toList()); System.out.print(evenNumbersList); } } ``` #### 3.2 將流轉換為數組 – `Stream.toArray(EntryType[]::new)` ```java public class StreamBuilders { public static void main(String[] args){ List<Integer> list = new ArrayList<Integer>(); for(int i = 1; i< 10; i++){ list.add(i); } Stream<Integer> stream = list.stream(); Integer[] evenNumbersArr = stream.filter(i -> i%2 == 0).toArray(Integer[]::new); System.out.print(evenNumbersArr); } } ``` 還有很多其他方式可以將流收集到`Set`,`Map`或多種方式中。 只需通過**收集器**類并嘗試牢記它們。 ## 4\. 核心流操??作 流抽象為您提供了一長串有用的函數。 我不會覆蓋所有內容,但是我打算在這里列出所有最重要的內容,您必須第一手知道。 在繼續之前,讓我們預先構建`String`的集合。 我們將在此列表上構建示例,以便易于聯系和理解。 ```java List<String> memberNames = new ArrayList<>(); memberNames.add("Amitabh"); memberNames.add("Shekhar"); memberNames.add("Aman"); memberNames.add("Rahul"); memberNames.add("Shahrukh"); memberNames.add("Salman"); memberNames.add("Yana"); memberNames.add("Lokesh"); ``` 這些核心方法分為以下兩個部分: #### 4.1 中間操作 **中間操作返回流本身**,因此您可以連續鏈接多個方法調用。 讓我們學習重要的東西。 ###### 4.1.1 `Stream.filter()` `Filter`接受謂詞以過濾流中的所有元素。 此操作是中間操作,使我們能夠對結果調用另一個流操作(例如`forEach`)。 ```java memberNames.stream().filter((s) -> s.startsWith("A")) .forEach(System.out::println); Output: Amitabh Aman ``` ###### 4.1.2\. `Stream.map()` 中間操作映射通過給定的函數將每個元素轉換為另一個對象。 下面的示例將每個字符串轉換為大寫字符串。 但是您也可以使用`map()`將每個對象轉換為另一種類型。 ```java memberNames.stream().filter((s) -> s.startsWith("A")) .map(String::toUpperCase) .forEach(System.out::println); Output: AMITABH AMAN ``` ###### 4.1.2 `Stream.sorted()` `Sorted`是一個中間操作,它返回流的排序視圖。 除非您通過自定義比較器,否則元素將以自然順序排序。 ```java memberNames.stream().sorted() .map(String::toUpperCase) .forEach(System.out::println); Output: AMAN AMITABH LOKESH RAHUL SALMAN SHAHRUKH SHEKHAR YANA ``` 請記住,`sorted`只會創建流的排序視圖,而不會操縱支持的集合的順序。 `memberNames`的順序保持不變。 #### 4.2 終止操作 **終止操作返回某個類型**的結果,而不是流。 ###### 4.2.1 `Stream.forEach()` 此方法有助于迭代流的所有元素,并對每個元素執行一些操作。 該操作作為 lambda 表達式參數傳遞。 ```java memberNames.forEach(System.out::println); ``` ###### 4.2.2 `Stream.collect()` `collect()`方法用于從流中接收元素并將其存儲在集合中,并在參數函數中提到。 ```java List<String> memNamesInUppercase = memberNames.stream().sorted() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.print(memNamesInUppercase); Output: [AMAN, AMITABH, LOKESH, RAHUL, SALMAN, SHAHRUKH, SHEKHAR, YANA] ``` ###### 4.2.3 `Stream.match()` 各種匹配操作可用于檢查某個謂詞是否與流匹配。 所有這些操作都是終止操作,并返回布爾結果。 ```java boolean matchedResult = memberNames.stream() .anyMatch((s) -> s.startsWith("A")); System.out.println(matchedResult); matchedResult = memberNames.stream() .allMatch((s) -> s.startsWith("A")); System.out.println(matchedResult); matchedResult = memberNames.stream() .noneMatch((s) -> s.startsWith("A")); System.out.println(matchedResult); Output: true false false ``` ###### 4.2.4 `Stream.count()` Count 是一個終止操作,將流中的元素數作為`long`值返回。 ```java long totalMatched = memberNames.stream() .filter((s) -> s.startsWith("A")) .count(); System.out.println(totalMatched); Output: 2 ``` ###### 4.2.5 `Stream.reduce()` 此終止操作使用給定函數對流的元素進行歸約。 結果是一個保留歸約的可選值。 ```java Optional<String> reduced = memberNames.stream() .reduce((s1,s2) -> s1 + "#" + s2); reduced.ifPresent(System.out::println); Output: Amitabh#Shekhar#Aman#Rahul#Shahrukh#Salman#Yana#Lokesh ``` ## 5\. 流短路操作 盡管對滿足謂詞的集合內的所有元素執行流操作,但通常需要在迭代過程中遇到匹配元素時中斷操作。 在外部迭代中,將使用`if-else`塊。 在內部迭代中,可以使用某些方法來實現此目的。 讓我們看一下兩種方法的示例: #### 5.1 `Stream.anyMatch()` 一旦作為謂詞傳遞的條件滿足,此方法將返回`true`。 它不會再處理任何元素。 ```java boolean matched = memberNames.stream() .anyMatch((s) -> s.startsWith("A")); System.out.println(matched); Output: true ``` #### 5.2 `Stream.findFirst()` 它將從流中返回第一個元素,然后不再處理任何其他元素。 ```java String firstMatchedName = memberNames.stream() .filter((s) -> s.startsWith("L")) .findFirst().get(); System.out.println(firstMatchedName); Output: Lokesh ``` ## 6\. Java 流中的并行性 借助 Java SE 7 中添加的派生/連接框架,我們有了有效的機制來在應用程序中實現并行操作。 但是,實現此框架本身是一項復雜的任務,如果沒有正確執行,那么這是一項艱巨的任務。 它是可能導致應用程序崩潰的復雜多線程錯誤的來源。 通過引入內部迭代,我們可以并行執行操作。 要啟用并行性,您要做的就是創建并行流,而不是順序流。 令您驚訝的是,這確實非常容易。 在上面列出的任何流示例中,只要您想在并行內核中使用多個線程來完成特定作業,您都必須調用方法`parallelStream()`方法而不是`stream()`方法。 ```java public class StreamBuilders { public static void main(String[] args){ List<Integer> list = new ArrayList<Integer>(); for(int i = 1; i< 10; i++){ list.add(i); } //Here creating a parallel stream Stream<Integer> stream = list.parallelStream(); Integer[] evenNumbersArr = stream.filter(i -> i%2 == 0).toArray(Integer[]::new); System.out.print(evenNumbersArr); } } ``` 這項工作的主要推動力是使并行性更易于開發人員使用。 盡管 Java 平臺已經為并發和并行性提供了強大的支持,但是開發人員在根據需要將其代碼從順序遷移到并行時會遇到不必要的障礙。 因此,重要的是要鼓勵順序友好和并行友好的習語。 通過將重點轉移到描述應該執行什么計算,而不是應該如何執行計算,可以方便地進行操作。 同樣重要的是要在使并行性變得更容易但不至于使其變得不可見之間取得平衡。 使并行性透明將引入不確定性,并可能在用戶可能不期望的情況下進行數據競爭。 關于 Java 8 中引入的**流抽象的基礎知識**,這就是我要分享的全部內容。 我將在以后的文章中討論與流相關的其他各種事情。 學習愉快! 閱讀更多: #### 流操作 **中間操作** * [`filter()`](https://howtodoinjava.com/java8/java-stream-filter-example/) * [`map()`](https://howtodoinjava.com/java8/stream-map-example/) * [`flatMap()`](https://howtodoinjava.com/java8/stream-flatmap-example/) * [`distant()`](https://howtodoinjava.com/java8/java-stream-distinct-examples/) * [`sorted()`](https://howtodoinjava.com/java8/stream-sorted-method/) * [`peek()`](https://howtodoinjava.com/java8/java-stream-peek-example/) * [`limit()`](https://howtodoinjava.com/java8/java-stream-limit-method-example/) * [`skip()`](https://howtodoinjava.com/java8/stream-skip-example/) **終止操作** * [`forEach()`](https://howtodoinjava.com/java8/java-stream-foreach/) * [`forEachOrdered()`](https://howtodoinjava.com/java8/java-stream-foreachordered/) * [`toArray()`](https://howtodoinjava.com/java8/convert-stream-to-array/) * `reduce()` * `collect()` * [`min()`](https://howtodoinjava.com/java8/java-stream-min/) * [`max()`](https://howtodoinjava.com/java8/java-stream-max/) * [`count()`](https://howtodoinjava.com/java8/stream-count-elements-example/) * [`anyMatch()`](https://howtodoinjava.com/java8/stream-anymatch-example/) * [`allMatch()`](https://howtodoinjava.com/java8/stream-allmatch-example/) * [`noneMatch()`](https://howtodoinjava.com/java8/stream-nonematch-example/) * [`findFirst()`](https://howtodoinjava.com/java8/stream-findfirst-findany/) * [`findAny()`](https://howtodoinjava.com/java8/stream-findfirst-findany/) #### 其他例子 [Java 8 – 流`map()`與`flatMap()`](https://howtodoinjava.com/java8/stream-map-vs-flatmap/) [Java 8 – 無限流](https://howtodoinjava.com/java8/java-infinite-stream/) [Java 8 – 流最大和最小](https://howtodoinjava.com/java8/stream-max-min-examples/) [Java 8 – 隨機數流](https://howtodoinjava.com/java8/stream-random-numbers-range/) [Java 8 – 流元素數](https://howtodoinjava.com/java8/stream-count-elements-example/) [Java 8 – 獲取流的最后一個元素](https://howtodoinjava.com/java8/java-stream-get-last-element/) [Java 8 – 在流中查找或刪除重復項](https://howtodoinjava.com/java8/stream-find-remove-duplicates/) [Java 8 – `IntStream`](https://howtodoinjava.com/java8/intstream-examples/) [Java 8 – `IntStream`到集合](https://howtodoinjava.com/java8/convert-intstream-collection-array/) [Java 8 – `IntPredicate`](https://howtodoinjava.com/java8/java8-intpredicate/) [Java 8 – 流去重](https://howtodoinjava.com/java8/java-stream-distinct-examples/) [Java 8 – 按多個字段的流去重](https://howtodoinjava.com/java8/stream-distinct-by-multiple-fields/) [Java 8 – 行流](https://howtodoinjava.com/java8/read-file-line-by-line-in-java-8-streams-of-lines-example/) [Java 8 – 流`if-else`邏輯](https://howtodoinjava.com/java8/stream-if-else-logic/) [Java 8 – 流重用 – 遍歷流多次?](https://howtodoinjava.com/java8/java-stream-reuse/) [Java 8 – 將流轉換為映射](https://howtodoinjava.com/java8/collect-stream-to-map/) [Java 8 – 將流轉換為數組](https://howtodoinjava.com/java8/convert-stream-to-array/) [Java 8 – 將流轉換為列表](https://howtodoinjava.com/java8/convert-stream-to-list/) [Java 8 – 將`Iterable`或`Iterator`轉換為流](https://howtodoinjava.com/java8/iterable-iterator-to-stream/) [Java 8 – 對數字和字符串排序](https://howtodoinjava.com/java8/stream-sorting/) [Java 8 – 對多個字段上的對象排序](https://howtodoinjava.com/java8/sort-stream-multiple-fields/) [Java 8 – 連接字符串流](https://howtodoinjava.com/java8/join-stream-of-strings/) [Java 8 – 合并流](https://howtodoinjava.com/java8/stream-concat-example/) [Java 9 – 流 API 改進](https://howtodoinjava.com/java9/stream-api-improvements/)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看