Stream 接口:
Java.util.stream??
stream的操作可以串行執(zhí)行或者并行執(zhí)行
JAVA 8 在 TIME中也提供了一些:
clock??
二刃泡、流
2.1 流介紹
流是Java API的新成員巧娱,它允許你以聲明性方式處理數(shù)據(jù)集合(通過查詢語句來表達,而不是臨時編寫一個實現(xiàn))烘贴。就現(xiàn)在來說禁添,你可以把它們看成遍歷數(shù)據(jù)集的高級迭代器。此外桨踪,流還可以透明地并行處理老翘,你無需寫任何多線程代碼了!
2.2 使用流
類別 方法名 方法簽名 作用
篩選切片 filter Stream<T> filter(Predicate<? super T> predicate) 過濾操作馒闷,根據(jù)Predicate判斷結(jié)果保留為真的數(shù)據(jù)酪捡,返回結(jié)果仍然是流
? distinct Stream<T> distinct() 去重操作,篩選出不重復(fù)的結(jié)果纳账,返回結(jié)果仍然是流
? limit Stream<T> limit(long maxSize) 截取限制操作逛薇,只取前 maxSize條數(shù)據(jù),返回結(jié)果仍然是流
? skip Stream<T> skip(long n) 跳過操作疏虫,跳過n條數(shù)據(jù)永罚,取后面的數(shù)據(jù)啤呼,返回結(jié)果仍然是流
映射 map <R> Stream<R> map(Function<? super T, ? extends R> mapper) 轉(zhuǎn)化操作,根據(jù)參數(shù)T呢袱,轉(zhuǎn)化成R類型官扣,返回結(jié)果仍然是流
? flatMap <R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) 轉(zhuǎn)化操作,根據(jù)參數(shù)T羞福,轉(zhuǎn)化成R類型流惕蹄,這里會生成多個R類型流,返回結(jié)果仍然是流
匹配 anyMatch boolean anyMatch(Predicate<? super T> predicate) 判斷是否有一條匹配治专,根據(jù)Predicate判斷結(jié)果中是否有一條匹配成功
? allMatch boolean allMatch(Predicate<? super T> predicate) 判斷是否全都匹配卖陵,根據(jù)Predicate判斷結(jié)果中是否全部匹配成功
? noneMatch boolean noneMatch(Predicate<? super T> predicate) 判斷是否一條都不匹配,根據(jù)Predicate判斷結(jié)果中是否所有的都不匹配
查找 findAny Optional<T> findAny() 查找操作张峰, 查詢當前流中的任意元素并返回Optional
? findFirst Optional<T> findFirst() 查找操作泪蔫, 查詢當前流中的第一個元素并返回Optional
歸約 reduce T reduce(T identity, BinaryOperator<T> accumulator); 歸約操作,同樣兩個類型的數(shù)據(jù)進行操作后返回相同類型的結(jié)果喘批。比如兩個整數(shù)相加撩荣、相乘等。
? max Optional<T> max(Comparator<? super T> comparator) 求最大值饶深,根據(jù)Comparator計算的比較結(jié)果得到最大值
? min Optional<T> min(Comparator<? super T> comparator) 求最小值餐曹,根據(jù)Comparator計算的比較結(jié)果得到最小值
匯總統(tǒng)計 collect <R, A> R collect(Collector<? super T, A, R> collector) 匯總操作,匯總對應(yīng)的處理結(jié)果粥喜。這里經(jīng)常與
? count long count() 統(tǒng)計流中數(shù)據(jù)數(shù)量
遍歷 foreach void forEach(Consumer<? super T> action) 遍歷操作凸主,遍歷執(zhí)行Consumer 對應(yīng)的操作
上面是Stream API的一些常用操作,按場景結(jié)合lambda表達式調(diào)用對應(yīng)方法即可额湘。至于Stream的生成方式卿吐,Stream的of方法或者Collection接口實現(xiàn)類的stream方法都可以獲得對應(yīng)的流對象,再進一步根據(jù)需要做對應(yīng)處理锋华。
另外上述方法如果返回是Stream對象時是可以鏈式調(diào)用的嗡官,這個時候這個操作只是聲明或者配方,不產(chǎn)生新的集合毯焕,這種類型的方法是惰性求值方法衍腥;有些方法返回結(jié)果非Stream類型,則是及早求值方法纳猫。
“為什么要區(qū)分惰性求值和及早求值婆咸? 只有在對需要什么樣的結(jié)果和操 作有了更多了解之后, 才能更有效率地進行計算芜辕。 例如尚骄, 如果要找出大于 10 的第一個數(shù)字, 那么并不需要和所有元素去做比較侵续, 只要找出第一個匹配的元素就夠了倔丈。 這也意味著可以在集合類上級聯(lián)多種操作憨闰, 但迭代只需一次。這也是函數(shù)編程中惰性計算的特性需五,即只在需要產(chǎn)生表達式的值時進行計算鹉动。這樣代碼更加清晰,而且省掉了多余的操作宏邮。
這里還對上述列表操作中相關(guān)的Optional與Collectors類做下說明泽示。
Optional類是為了解決經(jīng)常遇到的NullPointerException出現(xiàn)的,這個類是一個可能包含空值的容器類蜀铲。用Optional替代null可以顯示說明結(jié)果可能為空或不為空边琉,再使用時使用isPresent方法判斷就可以避免直接調(diào)用的空指針異常。
Collectors類是一個非常有用的是歸約操作工具類记劝,工具類中的方法常與流的collect方法結(jié)合使用。比如
groupingBy方法可以用來分組族扰,在轉(zhuǎn)化Map時非常實用厌丑;partitioningBy方法可以用來分區(qū)(分區(qū)可以當做一種特殊的分組,真假值分組)渔呵,joining方法可以用來連接怒竿,這個應(yīng)用在比如字符串拼接的場景。
2.3 并行流
Collection接口的實現(xiàn)類調(diào)用parallelStream方法就可以實現(xiàn)并行流扩氢,相應(yīng)地也獲得了并行計算的能力耕驰。或者Stream接口的實現(xiàn)調(diào)用parallel方法也可以得到并行流录豺。并行流實現(xiàn)機制是基于fork/join 框架朦肘,將問題分解再合并處理。
不過并行計算是否一定比串行快呢双饥?這也不一定媒抠。實際影響性能的點包括:
(1)數(shù)據(jù)大小輸入數(shù)據(jù)的大小會影響并行化處理對性能的提升。 將問題分解之后并行化處理咏花, 再將結(jié)果合并會帶來額外的開銷趴生。 因此只有數(shù)據(jù)足夠大、 每個數(shù)據(jù)處理管道花費的時間足夠多
時昏翰, 并行化處理才有意義苍匆。
(2) 源數(shù)據(jù)結(jié)構(gòu)
每個管道的操作都基于一些初始數(shù)據(jù)源, 通常是集合棚菊。 將不同的數(shù)據(jù)源分割相對容易浸踩,這里的開銷影響了在管道中并行處理數(shù)據(jù)時到底能帶來多少性能上的提升。
(3) 裝箱
處理基本類型比處理裝箱類型要快窍株。
(4) 核的數(shù)量
極端情況下民轴, 只有一個核攻柠, 因此完全沒必要并行化。 顯然后裸, 擁有的核越多瑰钮, 獲得潛在性能提升的幅度就越大。 在實踐中微驶, 核的數(shù)量不單指你的機器上有多少核浪谴, 更是指運行時你的機器能使用多少核。 這也就是說同時運行的其他進程因苹, 或者線程關(guān)聯(lián)性( 強制線程在某些核或 CPU 上運行) 會影響性能苟耻。
(5) 單元處理開銷
比如數(shù)據(jù)大小, 這是一場并行執(zhí)行花費時間和分解合并操作開銷之間的戰(zhàn)爭扶檐。 花在流中
每個元素身上的時間越長凶杖, 并行操作帶來的性能提升越明顯
實際在考慮是否使用并行時需要考慮上面的要素。在討論流中單獨操作每一塊的種類時款筑, 可以分成兩種不同的操作: 無狀態(tài)的和有狀態(tài)的智蝠。無狀態(tài)操作整個過程中不必維護狀態(tài), 有狀態(tài)操作則有維護狀態(tài)所需的開銷和限制奈梳。如果能避開有狀態(tài)杈湾, 選用無狀態(tài)操作, 就能獲得更好的并行性能攘须。 無狀態(tài)操作包括 map漆撞、filter 和 flatMap, 有狀態(tài)操作包括 sorted于宙、 distinct 和 limit浮驳。這種理解在理論上是更好的,當然實際使用還是以測試結(jié)果最為可靠 限煞。
————————————————
版權(quán)聲明:本文為CSDN博主「蟲草」的原創(chuàng)文章抹恳,遵循CC 4.0 by-sa版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明署驻。
原文鏈接:https://blog.csdn.net/qiubabin/article/details/70256683
9.38--9.51