Stream初步應用

一、什麼是stream

  Stream(流)是一個來自數據源的元素隊列並支持聚合操作,數據來源可以從inputstream,數組,集合中獲取;聚合操作可以類似SQL語句一樣的操作, 比如filter, map, reduce, find, match, sorted等。

二、stream基本方法的使用

public class StreamRefer {

    public List<String> names = new ArrayList<>();
    /**
     * 流獲取方式
     */
    @Test
    public void testGetStream(){
        //流的獲取
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        //方式一:通過集合的stream方法獲取
        Stream stream1 = names.stream();
        System.out.println(stream1);

        //方式二:通過stream的of方法獲取
        Stream stream2 = Stream.of(names);
        System.out.println(stream2);

        //方式三:通過parallelStream來創建並行流
        Stream stream = names.parallelStream();
        System.out.println(stream);

    }

    /**
     * 流的方法測試
     */
    @Test
    public void testStreamMethodForeach(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        Stream<String> nameStream = names.stream();
        //void forEach(Consumer action)對流進行循環操作,輸入一個參數,無參數輸出,無法流式編程
        nameStream.forEach(s-> System.out.println(s.toUpperCase()));
    }

    @Test
    public void testStreamMethodFilter(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        Stream<String> nameStream = names.stream();
        //filter(Predicate p) 返回一個與給定判斷條件匹配的元素組成的流,接受一個輸入參數,返回一個booleal值,可以流式編程
        nameStream.filter(s->s.length()>4).forEach(System.out::println);
    }

    @Test
    public void testStreamMethodCount(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        Stream<String> nameStream = names.stream();
        //count() 返回一個參數流的個數
        System.out.println(nameStream.count());
    }

    @Test
    public void testStreamMethodLimit(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        Stream<String> nameStream = names.stream();
       /*
        * Stream limit(long maxSize) 獲得流中前 maxSize 個元素,將元素添加到另一個流中返回
        *如果 maxSize 大於等於當前流的元素個數,則所有元素都會獲取到
        *如果 maxSize 等於 0,則會獲得一個空流。
        *可以流式編程
        */
       //1.獲取前面幾個流,當爲0是爲空流但不會爲null
        Stream<String> limitStream = nameStream.limit(0);
        System.out.println(limitStream);
        limitStream.forEach(System.out::println);
        //2.獲取前面幾個流,當爲大於size返回整個流
        Stream<String> limitStreamWhole = nameStream.limit(5);
        limitStreamWhole.forEach(System.out::println);
        //3.獲取前面幾個流,當爲小於於size大於0返回整個流
        Stream<String> limitStreamPart = nameStream.limit(2);
        limitStreamPart.forEach(System.out::println);
    }


    @Test
    public void testStreamMethodSkip(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        Stream<String> nameStream = names.stream();
        //跳過前面幾個,可以流式編程
        nameStream.skip(1).forEach(System.out::println);
    }

    @Test
    public void testStreamMethodMap(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        List<String> values = new ArrayList<>();
        values.add("張三");
        values.add("李四");
        Stream<String> nameStream = names.stream();
        Stream<String> valueStream = values.stream();
        // Stream concat(Stream a,Stream b)兩個流合併返回一個新的流
        Stream.concat(nameStream,valueStream).forEach(System.out::println);
    }

    @Test
    public void testStreamMethodConcat(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        Stream<String> nameStream = names.stream();
        //map(Function mapper) 該接口需要一個 Function 函數式接口參數,可以將當前流中的 T 類型數據轉換爲另一種 R 類型的流。
        nameStream.map(name -> name.length()).forEach(System.out::println);
    }

    @Test
    public void testStreamMethodSort(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        Stream<String> nameStream = names.stream();
        //sorted(Comparator<? super T> comparator)排序
        nameStream.map(name -> name.length()).sorted().forEach(System.out::println);
    }

    @Test
    public void testStreamMethodCollect(){
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        //collect(toList())將流轉成集合
        List<Integer> convertCoinTypes = names.stream().map(coinType -> coinType.length()).collect(toList());
        convertCoinTypes.forEach(System.out::println);
    }
    
}

  

三、stream總結

  注意點:①在流式編程中一樣需要符合lambda表達式對域的規範;

      ②流式編程可以簡化我們的編碼風格。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章