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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ### [在`map()`中組合流](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=%e5%9c%a8-map-%e4%b8%ad%e7%bb%84%e5%90%88%e6%b5%81) 假設我們現在有了一個傳入的元素流,并且打算對流元素使用`map()`函數。現在你已經找到了一些可愛并獨一無二的函數功能,但是問題來了:這個函數功能是產生一個流。我們想要產生一個元素流,而實際卻產生了一個元素流的流。 `flatMap()`做了兩件事:將產生流的函數應用在每個元素上(與`map()`所做的相同),然后將每個流都扁平化為元素,因而最終產生的僅僅是元素。 `flatMap(Function)`:當`Function`產生流時使用。 `flatMapToInt(Function)`:當`Function`產生`IntStream`時使用。 `flatMapToLong(Function)`:當`Function`產生`LongStream`時使用。 `flatMapToDouble(Function)`:當`Function`產生`DoubleStream`時使用。 為了弄清它的工作原理,我們從傳入一個刻意設計的函數給`map()`開始。該函數接受一個整數并產生一個字符串流: ~~~ // streams/StreamOfStreams.java import java.util.stream.*; public class StreamOfStreams { public static void main(String[] args) { Stream.of(1, 2, 3) .map(i -> Stream.of("Gonzo", "Kermit", "Beaker")) .map(e-> e.getClass().getName()) .forEach(System.out::println); } } ~~~ 輸出結果: ~~~ java.util.stream.ReferencePipeline$Head java.util.stream.ReferencePipeline$Head java.util.stream.ReferencePipeline$Head ~~~ 我們天真地希望能夠得到字符串流,但實際得到的卻是“Head”流的流。我們可以使用`flatMap()`解決這個問題: ~~~ // streams/FlatMap.java import java.util.stream.*; public class FlatMap { public static void main(String[] args) { Stream.of(1, 2, 3) .flatMap(i -> Stream.of("Gonzo", "Fozzie", "Beaker")) .forEach(System.out::println); } } ~~~ 輸出結果: ~~~ Gonzo Fozzie Beaker Gonzo Fozzie Beaker Gonzo Fozzie Beaker ~~~ 從映射返回的每個流都會自動扁平為組成它的字符串。 下面是另一個演示,我們從一個整數流開始,然后使用每一個整數去創建更多的隨機數。 ~~~ // streams/StreamOfRandoms.java import java.util.*; import java.util.stream.*; public class StreamOfRandoms { static Random rand = new Random(47); public static void main(String[] args) { Stream.of(1, 2, 3, 4, 5) .flatMapToInt(i -> IntStream.concat( rand.ints(0, 100).limit(i), IntStream.of(-1))) .forEach(n -> System.out.format("%d ", n)); } } ~~~ 輸出結果: ~~~ 58 -1 55 93 -1 61 61 29 -1 68 0 22 7 -1 88 28 51 89 9 -1 ~~~ 在這里我們引入了`concat()`,它以參數順序組合兩個流。 如此,我們在每個隨機`Integer`流的末尾添加一個 -1 作為標記。你可以看到最終流確實是從一組扁平流中創建的。 因為`rand.ints()`產生的是一個`IntStream`,所以我必須使用`flatMap()`、`concat()`和`of()`的特定整數形式。 讓我們再看一下將文件劃分為單詞流的任務。我們最后使用到的是**FileToWordsRegexp.java**,它的問題是需要將整個文件讀入行列表中 —— 顯然需要存儲該列表。而我們真正想要的是創建一個不需要中間存儲層的單詞流。 下面,我們再使用 `flatMap()`來解決這個問題: ~~~ // streams/FileToWords.java import java.nio.file.*; import java.util.stream.*; import java.util.regex.Pattern; public class FileToWords { public static Stream<String> stream(String filePath) throws Exception { return Files.lines(Paths.get(filePath)) .skip(1) // First (comment) line .flatMap(line -> Pattern.compile("\\W+").splitAsStream(line)); } } ~~~ `stream()`現在是一個靜態方法,因為它可以自己完成整個流創建過程。 注意:`\\W+`是一個正則表達式。表示“非單詞字符”,`+`表示“可以出現一次或者多次”。小寫形式的`\\w`表示“單詞字符”。 我們之前遇到的問題是`Pattern.compile().splitAsStream()`產生的結果為流,這意味著當我們只是想要一個簡單的單詞流時,在傳入的行流(stream of lines)上調用`map()`會產生一個單詞流的流。幸運的是,`flatMap()`可以將元素流的流扁平化為一個簡單的元素流。或者,我們可以使用`String.split()`生成一個數組,其可以被`Arrays.stream()`轉化成為流: ~~~ .flatMap(line -> Arrays.stream(line.split("\\W+")))) ~~~ 因為有了真正的流(而不是`FileToWordsRegexp.java`中基于集合存儲的流),所以每次需要一個新的流時,我們都必須從頭開始創建,因為流不能被復用: ~~~ // streams/FileToWordsTest.java import java.util.stream.*; public class FileToWordsTest { public static void main(String[] args) throws Exception { FileToWords.stream("Cheese.dat") .limit(7) .forEach(s -> System.out.format("%s ", s)); System.out.println(); FileToWords.stream("Cheese.dat") .skip(7) .limit(2) .forEach(s -> System.out.format("%s ", s)); } } ~~~ 輸出結果: ~~~ Not much of a cheese shop really is it ~~~ 在`System.out.format()`中的`%s`表明參數為**String**類型。
                  <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>

                              哎呀哎呀视频在线观看