以前介紹過stream的部分操做,感受寫的太簡單的,示例也太少了,此次再次整理了stream類下你們在工做中會經常使用的方法。java
Stream流非IO流,Java 8 中的 Stream 是對集合(Collection)對象功能的加強,它專一於對集合對象進行各類很是便利、高效的聚合操做(aggregate operation),或者大批量數據操做 (bulk data operation)。而後使用lambda表達式可讓你的代碼寫的更少,作的更多!
** 聚合操做**算法
你們在使用數據庫的時候都會用到一些聚合函數,例如 avg(),count(),min(),max().可是您的項目經理或許不容許讓你在sql中寫大量的函數,寫過多的邏輯,都是一些簡單的sql語句,而後處理數據的邏輯放給代碼進行處理,無論你的訪問壓力大小,讓你的sql變簡單都是一個很好的習慣,你們之後也要注意下哈。這時候返回的集合數據,就須要處理了,以前的處理方式for循環,而後在每一個循環對象內進行邏輯判斷。如今jdk8提供了stream流。這樣讓咱們在對集合數據進行去重,過濾,遍歷數據都變得方便許多。
** 什麼是流**sql
Stream 不是集合元素,它不是數據結構並不保存數據,它是有關算法和計算的,它更像一個高級版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個一個遍歷元素並對其執行某些操做;高級版本的 Stream,用戶只要給出須要對其包含的元素執行什麼操做,好比 「過濾掉長度大於 10 的字符串」、「獲取每一個字符串的首字母」等,Stream 會隱式地在內部進行遍歷,作出相應的數據轉換。
Stream 就如同一個迭代器(Iterator),單向,不可往復,數據只能遍歷一次,遍歷過一次後即用盡了,就比如流水從面前流過,一去不復返。數據庫
而和迭代器又不一樣的是,Stream 能夠並行化操做,迭代器只能命令式地、串行化操做。顧名思義,當使用串行方式去遍歷時,每一個 item 讀完後再讀下一個 item。而使用並行去遍歷時,數據會被分紅多個段,其中每個都在不一樣的線程中處理,而後將結果一塊兒輸出。Stream 的並行操做依賴於 Java7 中引入的 Fork/Join 框架(JSR166y)來拆分任務和加速處理過程。Java 的並行 API 演變歷程基本以下:數組
Stream 的另一大特色是,數據源自己能夠是無限的。數據結構
下面介紹詳細的操做代碼框架
我在工做中經常使用到對流的操做有filter,map,兩種操做 filter:過濾,能夠在遍歷數據的時候在filter寫判斷條件 map:操做,根絕遍歷的對象,不須要過濾,只是對每一個對象進行處理,好比要返回每一個對象的某個字段
List users=new ArrayList<>(); //用戶集合中返回userId字段爲空的集合 List users1 = users.stream().filter(obj -> obj.getUserId().equals("")).collect(Collectors.toList()); //用戶集合中返回userId字段爲空的集合中的第二個開始查 返回第一個用戶對象 User user = users.stream().filter(obj -> obj.getUserId().equals("")).skip(1).findAny().get(); //用戶集合中返回userId字段爲空的集合中返回第一個用戶對象 User user1 = users.stream().filter(obj -> obj.getUserId().equals("")).findFirst().get(); //用戶集合中返回userId字段爲空的集合中返回第一個用戶對象(串行查詢跟上面結果同樣,並行查詢返回最快回來的那個) User user2 = users.stream().filter(obj -> obj.getUserId().equals("")).findAny().get(); //根據年齡降序排序用戶 不加reversed()方法默認升序 List collect = users.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());函數
排序也支持多條件排序,在第一個排序後面加一個線程
thenComparing() 即爲下一個排序條件code
還有distinct()方法去重,不過該方法只適用於基本類型的list。
//返回用戶裏面年齡大於10歲的用戶id List collect3 = collect.stream().filter(obj -> obj.getAge() > 10).map(User::getUserId).collect(Collectors.toList()); //年齡最大的用戶是多少歲 Integer integer = users.stream().map(User::getAge).max(Integer::compare).get(); //返回每一個用戶的用戶id List collect1 = users.stream().map(User::getUserId).collect(Collectors.toList()); //轉換用戶id的值爲小寫值 List collect2 = collect1.stream().map(String::toLowerCase).collect(Collectors.toList());
當你使用skip(),limit()方法等須要注意數組越界問題,由於有時候你的返回結果是一個空的。
還有對於filter與map同時使用的話記得先用filter再用map方法。
//返回一個map key是年齡 value是該年齡有多少人 Map collect4 = users.stream().collect(groupingBy(User::getAge, counting())); //返回一個map key是年齡 value是屬於該年齡的集合 Map> collect5 = users.stream().collect(groupingBy(User::getAge));
groupby後返回一個map也是經常使用的方法。
over