JDK12的新特性之teeing collectors
簡介
JDK12為java.util.stream.Collectors添加了一個新的teeing方法,怎么翻譯呢?看到很多人都把它翻譯成“發(fā)球臺”,我不禁潸然淚下,哪里有那么復雜,tee就是T。它的作用就像是一個T型,數(shù)據(jù)從兩頭進入,然后從一頭流出。teeing的作用也就在此。
talk is cheap, show me the code
我最喜歡的就是一言不合上代碼,文字的描述總是讓人有點摸不著頭腦,程序員還是要用程序說話。有了程序就有了邏輯,有了邏輯一切都有了。
各大網(wǎng)站上的例子都喜歡舉maxBy和minBy的例子,我這里偏不,下面舉一個統(tǒng)計學生平均分數(shù)和總分數(shù)的例子,希望大家能夠喜歡:
@Test public void useTeeing(){ List<Student> studentList= Arrays.asList( new Student("alice", 90), new Student("boy", 20), new Student("bruce", 40), new Student("batman", 100) ); String teeingResult=studentList.stream().collect( Collectors.teeing( Collectors.averagingInt(Student::getScore), Collectors.summingInt(Student::getScore), (s1,s2)-> s1+ ":"+ s2 ) ); log.info(teeingResult); }
好了,代碼來了,上面我構建了一個Student的List。然后通過Collectors.teeing操作,傳入了averagingInt和summingInt,最后通過一個merge表達式生成了最后的字符串。
我們看下輸出結果:
[main] INFO com.flydean.TeeingCollector - 62.5:250
Teeing方法深度剖析
作為一個有追求的程序員,不深入了解下T的本質(zhì),肯定是睡不著的。我們看下T的定義:
public static <T, R1, R2, R> Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1, Collector<? super T, ?, R2> downstream2, BiFunction<? super R1, ? super R2, R> merger)
首先分析一下T方法的返回值,T返回一個Collector。Collector是一個Reduction operations。它將輸入的元素經(jīng)過累計之后轉換成為一個結果集合。
我們再看一下Collector接口的定義:
public interface Collector<T, A, R>
Collector定義了三個參數(shù)類型,T是輸入元素的類型,A是reduction operation的累加類型也就是Supplier的初始類型,R是最終的返回類型。 我們畫個圖來看一下這些類型之間的轉換關系:
Stream中的A和Supplier中的A經(jīng)過accumulator和combiner,最終在finisher中轉換成R。
T方法需要傳入兩個downstream,這兩個downstream是兩個Collector,可以看到兩者的返回類型是可以不同的。
最后一個merger將R1和R2兩種類型轉換成了最終的返回類型R。
Characteristics
最后講一下Characteristics,Characteristics是指Collector的特征。
Characteristics是為了更好的執(zhí)行collector的reduce操作。
比如,如果Characteristics是UNORDERED,則表示Collector在處理過程中并不保存元素的順序,是沒有順序的。
如果Characteristics是CONCURRENT,則表示Collector會處理多線程的問題,而不需要Stream API來考慮。
因為T方法的前面兩個參數(shù)是Collector,并且最后也返回一個Collector。
那么如果downstream1和downstream2都是UNORDERED,T最后返回的Collector也是UNORDERED的。
如果downstream1和downstream2都是CONCURRENT,T最后返回的Collector也是CONCURRENT的。
總結
上面就是T的所有介紹了。
本文的例子https://github.com/ddean2009/learn-java-base-9-to-20
到此這篇關于JDK12的新特性之teeing collectors的文章就介紹到這了,更多相關jdk新特征teeing collectors內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn)
這篇文章主要介紹了Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-03-03java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例
本文主要介紹了java操作gaussDB數(shù)據(jù)庫的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07Spring Cloud 整合Apache-SkyWalking實現(xiàn)鏈路跟蹤的方法
這篇文章主要介紹了Spring Cloud 整合Apache-SkyWalking鏈路跟蹤的示例代碼,代碼簡單易懂,通過圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06