Java8 stream 學習1

jopen 9年前發布 | 14K 次閱讀 Java8 Java開發

 

java8 當中引入的了流處理。引入流處理方便對集合進行處理,當我們想要遍歷集合進行處理的時候可以使用 stram api 進行操作。

一個簡單的例子:統計一個字符串集合當中長度大于12的字符串的個數。

List<String> words;//從某處獲取
int count = 0;
for(String w : words) {
    if(w.length() > 12) {
        count++;
    }
}

如果使用 stram api 進行處理如下,簡潔明了:
List<String> words;//從某處獲取
int count = words.stream().filter( w -> w.length() > 12).count();

stream 與集合的區別:

  1. stream 自己不會存儲元素
  2. stream 不會改變原集合
  3. stream 可能是延遲執行的

處理 stream 也可以并行,只需要方法修改成 words.parallelStream().filter( w -> w.length() > 12).count()

當我們使用 stream 的時候一般會有三個階段來建立一個操作流水線。

  1. 創建 stream
  2. 在一個或者多個步驟當中,指定當初的 stream 轉換成另外一個 stream 的中間操作
  3. 使用終止操作產生一個結果,該操作會強制延遲操作立即執行,并且這個 stream 就不可以繼續使用。

創建 stream

創建 stream 如下:

@Test
    public void createStream() {
        Stream<String> stream = Stream.of("a", "b");
        Stream<String> stream2 = Stream.empty();
        Stream<String> stream3 = Stream.generate(() -> "aaa");// generate方法生產一個無限的Stream
        Stream<Double> stream4 = Stream.generate(Math::random);
        Stream<BigInteger> stream5 = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));// iterate方法生產一個無限的Stream
    }

Stream.iterate 方法的第一個參數是一個種子,第二個參數是一個函數。所以 stream5 序列的第一個元素是 BigInteger.ZERO,第二個是相當于 f(BigInteger.ZERO) ,我們傳遞的函數就是add BigInteger.ONE,第三個元素是f(f(BigInteger.ONE));

stream 轉換

@Test
    public void streamTOstream() {
        Stream<String> stream = Stream.of("a", "b", "c", "da", "asdass");
        Stream<String> stream2 = stream.filter(n -> n.length() > 3);
        Stream<String> stream3 = stream.map(String::toUpperCase);// map方法是對每個元素操作傳入的函數
        Stream<Stream<Character>> stream4 = stream.map(w -> characterStream(w));
        //上面的結果是[['a'],['b'],['c'],['d','a'],['a','s' ...]]
        //如果我們想獲得所有單詞的字符 Stream<Character> 這個可以使用 flatMap 方法
        Stream<Character> stream5 =  stream.flatMap(w -> characterStream(w));
        //上面的結果是['a', 'b', 'c', 'd', 'd', ...]
    }

    public static Stream<Character> characterStream(String string) {
        List<Character> result = new ArrayList<Character>();
        for (char c : string.toCharArray()) {
            result.add(c);
        }
        return result.stream();
    }

提取子流和組合流和就狀態轉換

@Test
    public void streamTOstream2() {
        Stream<Double> stream1 = Stream.generate(Math::random).limit(100);
        Stream<Double> stream2 = Stream.generate(Math::random).limit(100);
        Stream<Double> stream3 = Stream.concat(stream1, stream2);
        Stream<String> stream = Stream.of("a", "b", "c", "da", "asdass", "b");
        Stream<String> streamA = stream.distinct();//去重
        Stream<String> streamB = stream.sorted(Comparator.comparing(String::length));//排序

    }

【參考資料】

  1. 寫給大忙人看的Java SE 8
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!