【Java基礎】Java8-StreamAPI

  1. 概述
    1. Stream API(java.util.stream.*)
    2. Stream 是 Java8 中處理集合的關鍵抽象概念,它可以指定你希望對集合進行的操作,可以執行非常複雜的查找、過濾和映射數據等操作。
    3. 使用Stream API 對集合數據進行操作,就類似於使用 SQL 執行的數據庫查詢。也可以使用 Stream API 來並行執行操作。
    4. Stream API 提供了一種高效且易於使用的處理數據的方式
  1. 什麼是Stream
    1. 是數據渠道,用於操作數據源(集合、數組等)所生成的元素序列
    2. 集合講的是數據,流講的是計算
    3. 注意
      1. Stream 自己不會存儲元素。
      2. Stream 不會改變源對象。相反,他們會返回一個持有結果的新Stream。
      3. Stream 操作是延遲執行的。這意味着他們會等到需要結果的時候才執行。
  2. 操作步驟
    1. 創建stream
      1. 一個數據源(如: 集合、數組), 獲取一個流
      2. Java8 中的 Collection 接口被擴展,提供了兩個獲取流的方法
        1. default Stream<E> stream() : 返回一個順序流
        2. default Stream<E> parallelStream() : 返回一個並行流
      3. //1.Collection提供了兩個方法stream()與parallelStream()
        List<String>list=newArrayList<>();
        Stream<String>stream=list.stream();//獲取一個順序流
        Stream<String>parallelStream=list.parallelStream();//獲取一個並行流
        
        //2.通過Arrays中的stream()獲取一個數組流
        Integer[]nums=newInteger[10];
        Stream<Integer>stream1=Arrays.stream(nums);
        
        //3.通過Stream類中靜態方法of()
        Stream<Integer>stream2=Stream.of(1,2,3,4,5,6);
        
        //4.創建無限流
        //迭代
        Stream<Integer>stream3=Stream.iterate(0,(x)->x+2).limit(10);
        stream3.forEach(System.out::println);
        
        //生成
        Stream<Double>stream4=Stream.generate(Math::random).limit(2);
        stream4.forEach(System.out::println);
        
        

         

    2. 中間操作
      1. 一箇中間操作鏈,對數據源的數據進行處理
      2. 多箇中間操作可以連接起來形成一個流水線,除非流水線上觸發終止操作,否則中間操作不會執行任何的處理!而在終止操作時一次性全部處理,稱爲“惰性求值”
      3. 篩選與切片
        1. /*
          篩選與切片
          filter——接收Lambda,從流中排除某些元素。
          limit——截斷流,使其元素不超過給定數量。
          skip(n)——跳過元素,返回一個扔掉了前n個元素的流。若流中元素不足n個,則返回一個空流。與limit(n)互補
          distinct——篩選,通過流所生成元素的hashCode()和equals()去除重複元素
          */
          
          //內部迭代:迭代操作StreamAPI內部完成
          @Test
          publicvoidtest2(){
          //所有的中間操作不會做任何的處理
          Stream<Employee>stream=emps.stream()
          .filter((e)->{
          System.out.println("測試中間操作");
          returne.getAge()<=35;
          });
          
          //只有當做終止操作時,所有的中間操作會一次性的全部執行,稱爲“惰性求值”
          stream.forEach(System.out::println);
          }
          
          //外部迭代
          @Test
          publicvoidtest3(){
          Iterator<Employee>it=emps.iterator();
          
          while(it.hasNext()){
          System.out.println(it.next());
          }
          }
          

           

      4. 映射
        1. 映射

          map——接收Lambda,將元素轉換成其他形式或提取信息。接收一個函數作爲參數,該函數會被應用到每個元素上,並將其映射成一個新的元素。

          flatMap——接收一個函數作爲參數,將流中的每個值都換成另一個流,然後把所有流連接成一個流

      5. 排序
    3. 終止操作
      1. 概述:
        1. 一個終止操作,執行中間操作鏈,併產生結果
      2. 查找與匹配
        1. 終端操作會從流的流水線生成結果。其結果可以是任何不是流的值,例如: List、 Integer,甚至是 void
        2. allMatch——檢查是否匹配所有元素
          anyMatch——檢查是否至少匹配一個元素
          noneMatch——檢查是否沒有匹配的元素
          findFirst——返回第一個元素
          findAny——返回當前流中的任意元素
          count——返回流中元素的總個數
          max——返回流中最大值
          min——返回流中最小值

           

      3. 歸約
      4. 收集
        1. collect——將流轉換爲其他形式。接收一個Collector接口的實現,用於給Stream中元素做彙總的方法

  3. 並行流與串行流
    1. 並行流:把每一個內容分成多個數據塊,並用不用的線程分別處理每個數據塊的流
  4. 瞭解Fork/join 框架
    1. Fork/Join框架:就是在必要的情況下,將一個大任務,進行拆分(fork)成若干個小任務(拆到不可再拆時),再將一個個的小任務運算的結果進行join彙總。
  1. Fork/Join框架與傳統線程池的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章