JDK12的新特性之teeing collectors
簡(jiǎn)介
JDK12為java.util.stream.Collectors添加了一個(gè)新的teeing方法,怎么翻譯呢?看到很多人都把它翻譯成“發(fā)球臺(tái)”,我不禁潸然淚下,哪里有那么復(fù)雜,tee就是T。它的作用就像是一個(gè)T型,數(shù)據(jù)從兩頭進(jìn)入,然后從一頭流出。teeing的作用也就在此。
talk is cheap, show me the code
我最喜歡的就是一言不合上代碼,文字的描述總是讓人有點(diǎn)摸不著頭腦,程序員還是要用程序說(shuō)話。有了程序就有了邏輯,有了邏輯一切都有了。
各大網(wǎng)站上的例子都喜歡舉maxBy和minBy的例子,我這里偏不,下面舉一個(gè)統(tǒng)計(jì)學(xué)生平均分?jǐn)?shù)和總分?jǐn)?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);
}
好了,代碼來(lái)了,上面我構(gòu)建了一個(gè)Student的List。然后通過(guò)Collectors.teeing操作,傳入了averagingInt和summingInt,最后通過(guò)一個(gè)merge表達(dá)式生成了最后的字符串。
我們看下輸出結(jié)果:
[main] INFO com.flydean.TeeingCollector - 62.5:250
Teeing方法深度剖析
作為一個(gè)有追求的程序員,不深入了解下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返回一個(gè)Collector。Collector是一個(gè)Reduction operations。它將輸入的元素經(jīng)過(guò)累計(jì)之后轉(zhuǎn)換成為一個(gè)結(jié)果集合。
我們?cè)倏匆幌翪ollector接口的定義:
public interface Collector<T, A, R>
Collector定義了三個(gè)參數(shù)類型,T是輸入元素的類型,A是reduction operation的累加類型也就是Supplier的初始類型,R是最終的返回類型。 我們畫(huà)個(gè)圖來(lái)看一下這些類型之間的轉(zhuǎn)換關(guān)系:

Stream中的A和Supplier中的A經(jīng)過(guò)accumulator和combiner,最終在finisher中轉(zhuǎn)換成R。
T方法需要傳入兩個(gè)downstream,這兩個(gè)downstream是兩個(gè)Collector,可以看到兩者的返回類型是可以不同的。
最后一個(gè)merger將R1和R2兩種類型轉(zhuǎn)換成了最終的返回類型R。
Characteristics
最后講一下Characteristics,Characteristics是指Collector的特征。
Characteristics是為了更好的執(zhí)行collector的reduce操作。
比如,如果Characteristics是UNORDERED,則表示Collector在處理過(guò)程中并不保存元素的順序,是沒(méi)有順序的。
如果Characteristics是CONCURRENT,則表示Collector會(huì)處理多線程的問(wèn)題,而不需要Stream API來(lái)考慮。
因?yàn)門(mén)方法的前面兩個(gè)參數(shù)是Collector,并且最后也返回一個(gè)Collector。
那么如果downstream1和downstream2都是UNORDERED,T最后返回的Collector也是UNORDERED的。
如果downstream1和downstream2都是CONCURRENT,T最后返回的Collector也是CONCURRENT的。
總結(jié)
上面就是T的所有介紹了。
本文的例子https://github.com/ddean2009/learn-java-base-9-to-20
到此這篇關(guān)于JDK12的新特性之teeing collectors的文章就介紹到這了,更多相關(guān)jdk新特征teeing collectors內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)應(yīng)用之任務(wù)執(zhí)行分析
這篇文章主要為大家詳細(xì)介紹了JavaJava并發(fā)應(yīng)用編程中任務(wù)執(zhí)行分析的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-07-07
SpringBoot項(xiàng)目改為SpringCloud項(xiàng)目使用nacos作為注冊(cè)中心的方法
本文主要介紹了SpringBoot項(xiàng)目改為SpringCloud項(xiàng)目使用nacos作為注冊(cè)中心,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
SpringBoot中使用AOP實(shí)現(xiàn)日志記錄功能
AOP的全稱是Aspect-Oriented Programming,即面向切面編程(也稱面向方面編程),它是面向?qū)ο缶幊蹋∣OP)的一種補(bǔ)充,目前已成為一種比較成熟的編程方式,本文給大家介紹了SpringBoot中使用AOP實(shí)現(xiàn)日志記錄功能,需要的朋友可以參考下2024-05-05
java8之LocalDate的使用、LocalDate格式化問(wèn)題
這篇文章主要介紹了java8之LocalDate的使用、LocalDate格式化問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
java 最新Xss攻擊與防護(hù)(全方位360°詳解)
這篇文章主要介紹了java 最新Xss攻擊與防護(hù)(全方位360°詳解),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
如何使用JFrame完成動(dòng)態(tài)模擬時(shí)鐘
本文介紹了如何使用JFrame完成動(dòng)態(tài)模擬時(shí)鐘,需要的朋友可以參考下2015-08-08
springboot中實(shí)現(xiàn)上傳文件的功能簡(jiǎn)單示例
這篇文章主要給大家介紹了關(guān)于springboot中實(shí)現(xiàn)上傳文件功能的相關(guān)資料,在Spring Boot中實(shí)現(xiàn)文件上傳下載功能相對(duì)簡(jiǎn)單,文中給出了代碼示例,需要的朋友可以參考下2023-09-09
SpringBoot Redisson 集成的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot Redisson 集成的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05

