<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # [第十四章 流式編程](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=%e7%ac%ac%e5%8d%81%e5%9b%9b%e7%ab%a0-%e6%b5%81%e5%bc%8f%e7%bc%96%e7%a8%8b) > 集合優化了對象的存儲,而流和對象的處理有關。 流是一系列與特定存儲機制無關的元素——實際上,流并沒有“存儲”之說。 使用流,無需迭代集合中的元素,就可以從管道提取和操作元素。這些管道通常被組合在一起,形成一系列對流進行操作的管道。 在大多數情況下,將對象存儲在集合中是為了處理他們,因此你將會發現你將把編程的主要焦點從集合轉移到了流上。流的一個核心好處是,它使得程序更加短小并且更易理解。當 Lambda 表達式和方法引用(method references)和流一起使用的時候會讓人感覺自成一體。流使得 Java 8 更具吸引力。 舉個例子,假如你要隨機展示 5 至 20 之間不重復的整數并進行排序。實際上,你的關注點首先是創建一個有序集合。圍繞這個集合進行后續的操作。但是使用流式編程,你就可以簡單陳述你想做什么: ~~~ // streams/Randoms.java import java.util.*; public class Randoms { public static void main(String[] args) { new Random(47) .ints(5, 20) .distinct() .limit(7) .sorted() .forEach(System.out::println); } } ~~~ 輸出結果: ~~~ 6 10 13 16 17 18 19 ~~~ 首先,我們給**Random**對象一個種子(以便程序再次運行時產生相同的輸出)。`ints()`方法產生一個流并且`ints()`方法有多種方式的重載 — 兩個參數限定了產生的數值的邊界。這將生成一個隨機整數流。我們用中間流操作(intermediate stream operation)`distinct()`使流中的整數不重復,然后使用`limit()`方法獲取前 7 個元素。接下來使用`sorted()`方法排序。最終使用`forEach()`方法遍歷輸出,它根據傳遞給它的函數對流中的每個對象執行操作。在這里,我們傳遞了一個可以在控制臺顯示每個元素的方法引用:`System.out::println`。 注意`Randoms.java`中沒有聲明任何變量。流可以在不使用賦值或可變數據的情況下對有狀態的系統建模,這非常有用。 聲明式編程(Declarative programming)是一種編程風格,它聲明想要做什么,而非指明如何做。正如我們在函數式編程中所看到的。你會發現命令式編程的形式更難以理解。代碼示例: ~~~ // streams/ImperativeRandoms.java import java.util.*; public class ImperativeRandoms { public static void main(String[] args) { Random rand = new Random(47); SortedSet<Integer> rints = new TreeSet<>(); while(rints.size() < 7) { int r = rand.nextInt(20); if(r < 5) continue; rints.add(r); } System.out.println(rints); } } ~~~ 輸出結果: ~~~ [7, 8, 9, 11, 13, 15, 18] ~~~ 在`Randoms.java`中,我們無需定義任何變量,但在這里我們定義了 3 個變量:`rand`,`rints`和`r`。由于`nextInt()`方法沒有下限的原因(其內置的下限永遠為 0),這段代碼實現起來更復雜。所以我們要生成額外的值來過濾小于 5 的結果。 注意,你必須用力的研究才能弄明白`ImperativeRandoms.java`程序在干什么。而在`Randoms.java`中,代碼直接告訴了你它正在做什么。這種語義的清晰性是使用Java 8 流式編程的重要原因之一。 像在`ImperativeRandoms.java`中那樣顯式地編寫迭代過程的方式稱為外部迭代。而在`Randoms.java`中,你看不到任何上述的迭代過程,所以它被稱為內部迭代,這是流式編程的一個核心特征。內部迭代產生的代碼可讀性更強,而且能更簡單的使用多核處理器。通過放棄對迭代過程的控制,可以把控制權交給并行化機制。我們將在[并發編程](https://lingcoder.gitee.io/onjava8/#/24-Concurrent-Programming)一章中學習這部分內容。 另一個重要方面,流是懶加載的。這代表著它只在絕對必要時才計算。你可以將流看作“延遲列表”。由于計算延遲,流使我們能夠表示非常大(甚至無限)的序列,而不需要考慮內存問題。
                  <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>

                              哎呀哎呀视频在线观看