天天看點

Java8 Stream API介紹

stream的使用分為兩種類型:

intermediate,一個stream可以調用0到多個intermediate類型操作,每次調用會對stream做一定的處理,傳回一個新的stream,這類操作都是惰性化的(lazy),就是說,并沒有真正開始流的周遊。

常用操作:map (maptoint, flatmap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel

terminal,一個stream隻能執行一次terminal 操作,而且隻能是最後一個操作,執行terminal操作之後,stream就被消費掉了,并且産生一個結果。

常用操作:foreach、 foreachordered、 toarray、 reduce、 collect、 min、 max、 count、 anymatch、 allmatch、 nonematch、 findfirst、 findany

使用示例:

第一個參數supplier用于生成一個目标集合容器類型的執行個體;

函數biconsumer

以上寫法可以使用操作符“::”簡化,文法如下:

對象::執行個體方法

類::靜态方法

類::執行個體方法

java.util.stream.collectors類中已經預定義好了tolist,toset,tomap,tocollection等友善使用的方法,是以以上代碼還可以簡化如下:

将結果收集到map中,collectors.tomap方法的兩個重載定義如下:

keymapper函數用于從執行個體t中得到一個k類型的map key;

valuemapper函數用于從執行個體t中得到一個u類型的map value;

mergefunction函數用于處理key沖突的情況,預設為throwingmerger(),抛出illegalstateexception異常;

mapsupplier函數用于生成一個map執行個體;

假設有一個user實體類,有方法getid(),getname(),getage()等方法,現在想要将user類型的流收集到一個map中,示例如下:

這種寫法雖然可以實作分組功能,但是太過繁瑣,好在collectors中提供了groupingby方法,可以用來實作該功能,簡化後寫法如下:

類似的,collectors中還提供了partitioningby方法,接受一個predicate函數,該函數傳回boolean值,用于将内容分為兩組。假設user實體中包含性别資訊getsex(),可以按如下寫法将userstream按性别分組:

collectors中還提供了一些對分組後的元素進行downstream處理的方法:

counting方法傳回所收集元素的總數;

summing方法會對元素求和;

maxby和minby會接受一個比較器,求最大值,最小值;

mapping函數會應用到downstream結果上,并需要和其他函數配合使用;

以上為各種collectors操作的使用案例。

steam.filter方法接受一個predicate函數作為入參,該函數傳回一個boolean類型,下圖為stream和collectors方法參數的函數式接口:

Java8 Stream API介紹

stream的處理總會在最後的terminal操作才會真正執行;

沒有内部存儲,也不能改變使用到的資料源,每次操作都會生成一個新的流;

并行流使用fork/join 池來實作,對于非cpu密集型任務,需要謹慎使用;

相對于循環周遊操作代碼可讀性更高;