JAVA 8 主要新特性 ----------------(六)集合Stream API

1、簡介Streamjava

        Java8中有兩大最爲重要的改變。第一個是 Lambda 表達式;另一 個則是 Stream API(java.util.stream.*)。Stream 是 Java8 中處理集合的關鍵抽象概念,它能夠指定你但願對集合進行的操做,能夠執行很是複雜的查找、過濾和映射數據等操做。使用Stream API 對集合數據進行操做,就相似於使用 SQL 執行的數據庫查詢。也可使用 Stream API 來並行執行操做。簡而言之,Stream API 提供了一種高效且易於使用的處理數據的方式。
2、什麼是Stream
       
 流(Stream) 究竟是什麼呢?     
    是數據渠道,用於操做數據源(集合、數組等)所生成的元素序列。「集合講的是數據,流講的是計算!」git

注意:github

  (1)Stream 本身不會存儲元素。
     (2)
Stream 不會改變源對象。相反,他們會返回一個持有結果的新Stream。數組

     (3)Stream 操做是延遲執行的。這意味着他們會等到須要結果的時候才執行。網絡

3、Stream 的操做三個步驟ide

No.1 Stream函數

一、建立 Streamspa

       一個數據源(如:集合、數組),獲取一個流對象

       Java8 中的 Collection 接口被擴展,提供了 兩個獲取流的方法:
       
 default Stream<E> stream() : 返回一個順序流 
        default Stream<E> parallelStream() : 返回一個並行流排序

二、由數組建立流
         Java8 中的 Arrays 的靜態方法 stream() 可 以獲取數組流:
       
static <T> Stream<T> stream(T[] array): 返回一個流

重載形式,可以處理對應基本類型的數組: 
        public static IntStream stream(int[] array) 

        public static LongStream stream(long[] array) 

        public static DoubleStream stream(double[] array)

三、由值建立流

可使用靜態方法 Stream.of(), 經過顯示值 建立一個流。它能夠接收任意數量的參數。

        public static<T> Stream<T> of(T... values) : 返回一個流

四、由函數建立流:建立無限流

可使用靜態方法 Stream.iterate() 和 Stream.generate(), 建立無限流。迭代
       public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)

 

生成
public static<T> Stream<T> generate(Supplier<T> s) :

No.2 Stream

 

 

一、中間操做
       一箇中間操做鏈,對數據源的數據進行處理 

二、Stream 的中間操做
      多箇中間操做能夠鏈接起來造成一個流水線,除非流水 線上觸發終止操做,不然中間操做不會執行任何的處理! 而在終止操做時一次性所有處理,稱爲「惰性求值」。

篩選與切片

     

方法 描述
filter(Predicate p) 

接收 Lambda , 從流中排除某些元素。

distinct()   篩選,經過流所生成元素的 hashCode() 和 equals() 去 除重複元素 
limit(long maxSize) 

截斷流,使其元素不超過給定數量。

skip(long n) 

跳過元素,返回一個扔掉了前 n 個元素的流。若流中元素 不足 n 個,則返回一個空流。與 limit(n) 互補

 

容器中map和reduce

 

map案例

 

     (1)案例一:小寫轉大寫

 

                    「test」,「hello」,「world」,「java」,「tom」,「c」,「JavaScript」
       代碼:點擊這裏

 

     (2)案例二:元素擴大2倍

 

                    1,2,3,4—>2,4,6,8

 

                   代碼:點擊這裏

映射

       

方法 描述
map(Function f)

接收一個函數做爲參數,該函數會被應用到每一個元 素上,並將其映射成一個新的元素。

mapToDouble(ToDoubleFunction f)  接收一個函數做爲參數,該函數會被應用到每一個元 素上,產生一個新的 DoubleStream。 
mapToInt(ToIntFunction f)   接收一個函數做爲參數,該函數會被應用到每一個元 素上,產生一個新的 IntStream。 
mapToLong(ToLongFunction f) 

接收一個函數做爲參數,該函數會被應用到每一個元 素上,產生一個新的 LongStream。

flatMap(Function f)   接收一個函數做爲參數,將流中的每一個值都換成另 一個流,而後把全部流鏈接成一個流

   

reduce案例:
     (1)容器求和
                      1,2,3,4數據求和
              代碼:點擊這裏
 
map和reduce總結
     (1)map是針對每一個數據處理,reduce是針對集合最後處理.
     (2)map()進行數據重寫組合,reduce()是對集合中全部數據變爲一個結果.
       例如: SQL語句的sum\min\max方法功能
 

三、排序

方法 描述
sorted() 

產生一個新流,其中按天然順序排序

sorted(Comparator comp)  產生一個新流,其中按比較器順序排序

 

 
 
 
 
 
正序排序:
list.stream().sorted()                          --------------------------ASC
 
倒序排序:
list.stream().sorted().reversed()              ------------------------------------DESC
 
其中sorted中間能夠加入參數
list.stream().sorted(Person::getAge)        
 
Comparator使用
正序
list.stream().sorted(Comparator.comparing(Person::getAge)) 
 
倒序
list.stream().sorted(Comparator.comparing(Person::getAge).reversed())
 
No.3 終止操做
一、  終止操做(終端操做)

      一個終止操做,執行中間操做鏈,併產生結果

二、終端操做會從流的流水線生成結果。其結果能夠是任何不是流的 值,例如:List、Integer,甚至是 void 。

查找與匹配

方法 描述
allMatch(Predicate p) 

檢查是否匹配全部元素

anyMatch(Predicate p) 

檢查是否至少匹配一個元素

noneMatch(Predicate p) 

檢查是否沒有匹配全部元素

findFirst()   返回第一個元素
findAny()   返回當前流中的任意元素
count() 

返回流中元素總數

max(Comparator c) 

返回流中最大值

min(Comparator c) 

返回流中最小值

forEach(Consumer c)  內部迭代(使用 Collection 接口須要用戶去作迭 代,稱爲外部迭代。相反,Stream API 使用內部 迭代——它幫你把迭代作了)

 

     

 

 

 

 

 

 

 

 

 

 

 

 

 

歸約

reduce(T iden, BinaryOperator b)  能夠將流中元素反覆結合起來,獲得一個值。 返回 T 
reduce(BinaryOperator b)  能夠將流中元素反覆結合起來,獲得一個值。 返回 Optional<T> 

備註:

       map 和 reduce 的鏈接一般稱爲 map-reduce 模式,因 Google 用它 來進行網絡搜索而出名。

收集      

方法 描述
collect(Collector c) 

將流轉換爲其餘形式。接收一個 Collector接口的 實現,用於給Stream中元素作彙總的方法

 

 

 


Collector 接口中方法的實現決定了如何對流執行收集操做(如收
集到 List、Set、Map)。可是 Collectors 實用類提供了不少靜態方法,能夠方便地建立常見收集器實例。

 

Consumer

 

      定義:

 

             Consumer<T>表明了接受一個輸入參數而且無返回的操做,若是某一類操做不須要返回接口,能夠對該類操做抽取邏輯.

 

      方法:

 

             無返回函數操做void accept(T t);

 

     案例:

 

            遍歷容器forEach()方法
        代碼:點擊這裏

 

Predicate

 

     定義:

 

            Predicate函數式接口的主要做用就是提供一個test、

 

方法,接受一個參數返回一個布爾類型.

 

     方法:

 

            函數操做boolean test(T t);

 

    案例:

 

            容器中過濾數據.
    
           代碼:點擊這裏
相關文章
相關標籤/搜索