java8中Stream的使用以及分割list
一、Steam的優勢
java8中Stream配合Lambda表示式極大提高了程式設計效率,程式碼簡潔易懂(可能剛接觸的人會覺得晦澀難懂),不需要寫傳統的多執行緒程式碼就能寫出高效能的併發程式
二、專案中遇到的問題
由於微信介面限制,每次匯入code只能100個,所以需要分割list。但是由於code數量可能很大,這樣執行效率就會很低。
1.首先想到是用多執行緒寫傳統並行程式,但是博主不是很熟練,寫出程式碼可能會出現不可預料的結果,容易出錯也難以維護。
2.然後就想到Steam中的parallel,能提高效能又能利用java8的特性,何樂而不為。
三、廢話不多說,直接先貼程式碼,然後再解釋(java8分割list程式碼在標題四)。
1.該方法是根據傳入數量生成codes,private String getGeneratorCode(int tenantId)是我根據編碼規則生成唯一code這個不需要管,我們要看的是Stream.iterate
2.iterate()第一個引數為起始值,第二個函式表示式(看自己想要生成什麼樣的流關鍵在這裡),http://write.blog.csdn.net/postedit然後必須要通過limit方法來限制自己生成的Stream大小。parallel()是開啟並行處理。map()就是一對一的把Stream中的元素對映成ouput Steam中的 元素。最後用collect收集,
2.1 構造流的方法還有Stream.of(),結合或者陣列可直接list.stream();
String[] array = new String[]{"1","2","3"} ;
stream = Stream.of(array)或者Arrays.Stream(array);
2.2 數值流IntStream
int[] array = new int[]{1,2,3};
IntStream.of(array)或者IntStream.ranage(0,3)
3.以上構造流的方法都是已經知道大小,對於通過入參確定的應該圖中方法自己生成流。
四、java8分割list,利用StreamApi實現。
沒用java8前程式碼,做個鮮明對比():
1.list是我的編碼集合(codes)。MAX_SEND為100(即每次100的大小去分割list),limit為按編碼集合大小算出的本次需要分割多少次。
2.我們可以看到其實就是多了個skip跟limit方法。skip就是捨棄stream前多少個元素,那麼limit就是返回流前面多少個元素(如果流裡元素少於該值,則返回全部)。然後開啟並行處理。通過迴圈我們的分割list的目標就達到了,每次取到的sendList就是100,100這樣子的。
3.因為我這裡業務就只需要到這裡,如果我們分割之後需要收集之後再做處理,那隻需要改寫一下就ok;如:
List<List<String>> splitList = Stream.iterate(0,n->n+1).limit(limit).parallel().map(a->{
List<String> sendList = list.stream().skip(a*MAX_SEND).limit(MAX_SEND).parallel().collect(Collectors.toList());
}).collect(Collectors.toList());
五、java8流裡好像拿不到下標,所以我才用到構造一個遞增數列當下標用,這就是我用java8分割list的過程,比以前的for迴圈看的爽心悅目,優雅些,效能功也提高了。如果各位有更好的實現方式,歡迎留言指教。
相關推薦
java8中Stream的使用以及分割list
一、Steam的優勢 java8中Stream配合Lambda表示式極大提高了程式設計效率,程式碼簡潔易懂(可能剛接觸的人會覺得晦澀難懂),不需要寫傳統的多執行緒程式碼就能寫出高效能的併發程式 二、專案中遇到的問題 由於微信介面限制,每次匯入code只能100個,所以需要
java8中stream的map和flatmap的理解
ext 解法 -s char 個數 c89 ros slist https 轉自https://blog.csdn.net/wynjauu/article/details/78741093 假如我們有這樣一個需求給定單詞列表["Hello","World"],你想要返
Java8中Stream API的經典應用
經典的應用 public class TestTransaction { List<Transaction> transactions = null; @Before public void before(){ Trader raoul =
Java8中 stream,filter 等功能代替for迴圈(及)isPresent( ) 和 ifPresent() 簡單應用
直接上程式碼,比較實在。 物件A public Class A{ private Long id; private String userName; ....省略get和set方法 } 在List<A>中,查詢 userNa
Java基礎(十一):用Java8中Stream實現不同集合過濾
【前言】 從開源中國的對Java各個版本使用投票可以看出,目前Java8還是以67%的壓倒性優勢遙遙領先(Java 11 已正式釋出,你在使用 Java 的哪個版本?);眾所周知,Stream是Java8中的一大亮點,現在分享一下自己在工作中用它解決一個需求。
java8中stream中的任務拆分
在java8中流操作中,只有到終止符才會進行真正的求值。在設定了並行操作的時候,會對任務進行分解。 任務的分解用到了joinfork框架。 @Override public void compute() { Spliterator<P_IN> rs =
Java8中Stream的篩選,切片與映射的用法
toc sts cti 使用 cte random shc for -- Java8中Stream的篩選,切片與映射的用法 使用Stream的三個操作步驟 創建Stream 中間操作 終止操作(終端操作) @Test public void test1(){ /
Java8中Stream的歸約與收集
cati false 多級分組 其他 ring tis object () etc Java8中Stream的歸約與收集 歸約 reduce(T identity, BinaryOperator) / reduce(BinaryOperator) --可以將流中元素反復結合
Java8中使用filter()過濾列表,使用collect將stream轉化為list
Reference: https://www.mkyong.com/java8/java-8-streams-filter-examples/ /* In Java 8, using stream.filter() to filter a List, and colle
Java8中list轉map
mem style get 重復記錄 link name dHash long java8 第一種: 取list中某2個字段作為Map的K,V public Map<Long, String> getIdNameMap(List<Account>
Java開發知識之Java中的集合上List接口以及子類講解.
必須 元素 範圍 指向 指定 pub next 自己 什麽 Java開發知識之Java中的集合類 一丶什麽是集合類 如果你學習說數據結構,那麽學習集合就很簡單. 因為集合就是存儲數據的結構. 例如 有鏈表結構 (list ) 還有 map結構.等
Java開發知識之Java中的集合上List介面以及子類講解.
Java開發知識之Java中的集合類 一丶什麼是集合類 如果你學習說資料結構,那麼學習集合就很簡單. 因為集合就是儲存資料的結構. 例如 有連結串列結構 (list ) 還有 map結構.等等. 集合類就是儲存資料的集合. 我們可以看一下繼承圖: Co
利用java8 stream api 實現List集合分頁獲取工具
package com.test.paging; import java.util.Arrays; import java.util.List; /** * @author kevin.chen * Date 2017/11/9 * Time 18:05
使用 Java8的 stream對list資料去重
list去重,根據物件某個屬性、某幾個屬性去重 去除List中重複的String List unique = list.stream().distinct().collect(Collec
Java8中的Stream
目錄 流的構成 流的操作 結束語 為什麼需要Stream Stream 作為 Java 8 的一大亮點,它與 java.io 包裡的 InputStream 和 OutputStream 是完全不同的概念。它也不同於 StAX 對
java8中 map和flatmap的共同點和區別,以及兩者的例項解析
在函式式語言中,函式作為一等公民,可以在任何地方定義,在函式內或函式外,可以作為函式的引數和返回值,可以對函式進行組合。由於指令式程式設計語言也可以通過類似函式指標的方式來實現高階函式,函式式的最主要的好處主要是不可變性帶來的。沒有可變的狀態,函式就是引用透明(Referen
java8中根據判斷刪除列表list中的元素
我們知道,在java8出lambda表示式之前,是不支援在迴圈中直接對list進行刪除的。但是java8的新特性lambda表示式,幫我們實現了這個功能: List<String> lists = new ArrayList<>(); lists.add("a"); li
java8中List根據某一欄位去重
前言 在做一個記錄操作日誌功能,根據型別及稽核使用者名稱稱去查詢操作日誌。稽核使用者名稱稱,在這裡將資料全部查詢出來了,可是我只想要每個人的姓名,而不是出現重複人名,比如:楊平,出現了好多。如何解決此問
Java中的陣列和List集合以及型別強轉
在java中,集合操作有兩種方式——容器、陣列; 容器相比較於陣列,多了可擴充套件性,這裡僅以容器的代表List,來對比和陣列的關係。 都知道在java引入的泛型和自動拆裝箱等語法糖後,集合操作也變得簡單安全。 也都知道其實泛型在到位元組碼層面
Java8中的Stream API之Stream的背景及使用詳解
摘要: Stream是Java8的一大亮點,是對容器物件功能的增強,它專注於對容器物件進行各種非常便利、高效的 聚合操作(aggregate operation)或者大批量資料操作。Stream API藉助於同樣新出現的Lambda表示式,極大的提高程式設計效率和程式可讀性