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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### [集合](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=%e9%9b%86%e5%90%88) * `collect(Collector)`:使用**Collector**收集流元素到結果集合中。 * `collect(Supplier, BiConsumer, BiConsumer)`:同上,第一個參數**Supplier**創建了一個新的結果集合,第二個參數**BiConsumer**將下一個元素收集到結果集合中,第三個參數**BiConsumer**用于將兩個結果集合合并起來。 在這里我們只是簡單介紹了幾個**Collectors**的運用示例。實際上,它還有一些非常復雜的操作實現,可通過查看`java.util.stream.Collectors`的 API 文檔了解。例如,我們可以將元素收集到任意一種特定的集合中。 假設我們現在為了保證元素有序,將元素存儲在**TreeSet**中。**Collectors**里面沒有特定的`toTreeSet()`,但是我們可以通過將集合的構造函數引用傳遞給`Collectors.toCollection()`,從而構建任何類型的集合。下面我們來將一個文件中的單詞收集到**TreeSet**集合中。代碼示例: ~~~ // streams/TreeSetOfWords.java import java.util.*; import java.nio.file.*; import java.util.stream.*; public class TreeSetOfWords { public static void main(String[] args) throws Exception { Set<String> words2 = Files.lines(Paths.get("TreeSetOfWords.java")) .flatMap(s -> Arrays.stream(s.split("\\W+"))) .filter(s -> !s.matches("\\d+")) // No numbers .map(String::trim) .filter(s -> s.length() > 2) .limit(100) .collect(Collectors.toCollection(TreeSet::new)); System.out.println(words2); } } ~~~ 輸出結果: ~~~ [Arrays, Collectors, Exception, Files, Output, Paths, Set, String, System, TreeSet, TreeSetOfWords, args, class, collect, file, filter, flatMap, get, import, java, length, limit, lines, main, map, matches, new, nio, numbers, out, println, public, split, static, stream, streams, throws, toCollection, trim, util, void, words2] ~~~ **Files.**`lines()`打開**Path**并將其轉換成為由行組成的流。下一行代碼以一個或多個非單詞字符(`\\W+`)為分界,對每一行進行分割,結果是產生一個數組,然后使用**Arrays.**`stream()`將數組轉化成為流,最后`flatMap()`將各行形成的多個單詞流,扁平映射為一個單詞流。使用`matches(\\d+)`查找并移除全部是數字的字符串(注意,`words2`是通過的)。然后用**String.**`trim()`去除單詞兩邊的空白,`filter()`過濾所有長度小于3的單詞,并只獲取前100個單詞,最后將其保存到**TreeSet**中。 我們也可以在流中生成**Map**。代碼示例: ~~~ // streams/MapCollector.java import java.util.*; import java.util.stream.*; class Pair { public final Character c; public final Integer i; Pair(Character c, Integer i) { this.c = c; this.i = i; } public Character getC() { return c; } public Integer getI() { return i; } @Override public String toString() { return "Pair(" + c + ", " + i + ")"; } } class RandomPair { Random rand = new Random(47); // An infinite iterator of random capital letters: Iterator<Character> capChars = rand.ints(65,91) .mapToObj(i -> (char)i) .iterator(); public Stream<Pair> stream() { return rand.ints(100, 1000).distinct() .mapToObj(i -> new Pair(capChars.next(), i)); } } public class MapCollector { public static void main(String[] args) { Map<Integer, Character> map = new RandomPair().stream() .limit(8) .collect( Collectors.toMap(Pair::getI, Pair::getC)); System.out.println(map); } } ~~~ 輸出結果: ~~~ {688=W, 309=C, 293=B, 761=N, 858=N, 668=G, 622=F, 751=N} ~~~ **Pair**只是一個基礎的數據對象。**RandomPair**創建了隨機生成的**Pair**對象流。在 Java 中,我們不能直接以某種方式組合兩個流。所以我創建了一個整數流,并且使用`mapToObj()`將整數流轉化成為**Pair**流。**capChars**的隨機大寫字母迭代器創建了流,然后`next()`讓我們可以在`stream()`中使用這個流。就我所知,這是將多個流組合成新的對象流的唯一方法。 在這里,我們只使用最簡單形式的`Collectors.toMap()`,這個方法只需要兩個從流中獲取鍵和值的函數。還有其他重載形式,其中一種當是鍵發生沖突時,使用一個函數來處理沖突。 大多數情況下,`java.util.stream.Collectors`中預設的**Collector**就能滿足我們的要求。除此之外,你還可以使用第二種形式的`collect()`。 我把它留作更高級的練習,下例給出基本用法: ~~~ // streams/SpecialCollector.java import java.util.*; import java.util.stream.*; public class SpecialCollector { public static void main(String[] args) throws Exception { ArrayList<String> words = FileToWords.stream("Cheese.dat") .collect(ArrayList::new, ArrayList::add, ArrayList::addAll); words.stream() .filter(s -> s.equals("cheese")) .forEach(System.out::println); } } ~~~ 輸出結果: ~~~ cheese cheese ~~~ 在這里,**ArrayList**的方法已經做了你所需要的操作,但更有可能的是,如果你必須使用這種形式的`collect()`,就要自己創建特定的定義。
                  <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>

                              哎呀哎呀视频在线观看