本篇文章給大家分享的是有關(guān)如何在java 8項目中自定義collector,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)專注于邵武網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供邵武營銷型網(wǎng)站建設(shè),邵武網(wǎng)站制作、邵武網(wǎng)頁設(shè)計、邵武網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造邵武網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供邵武網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
需求:
將 一個容器List
假定有這樣一個Bean
public class SubjectOberser{ private String subjectKey; private AbstractObserver abstractObserver; ...geter seter 方法... }
我們需要按照 subjectKey 進行分組,分組過后的內(nèi)容 應(yīng)該為這樣一個容器Map
map 中的key,為SubjectOberser 屬性的subjectKey,值為List
實現(xiàn)過程
首先來看看collector 的接口定義
public interface Collector{ Supplier supplier(); BiConsumer accumulator(); Function finisher(); BinaryOperator combiner(); Set characteristics(); }
類型 T ,是在容器里面元素的類型
類型 A ,是accumulator 返回的類型,即是累加器的返回類型
類型 R ,是最終結(jié)果的類型
supplier 方法返回的結(jié)果必須為一個空的Supplier,也就是一個空的無參函數(shù)(簽名就是這樣的 ()->{}),在調(diào)用的時候它會創(chuàng)建一個空的累加器(accumulator)實例,供數(shù)據(jù)收集的時候使用,很明顯如果按照我們的需求試下你自己collector 這里應(yīng)該返回一個 () -> new HashMap<>()
,一個Map 來收集結(jié)果
accumulator 方法返回歸約操作的函數(shù)(簽名是這樣的 (a,b)->void ),當(dāng)遍歷到流中第n個元素時,這個函數(shù)執(zhí)行時會有兩個參數(shù):保存歸約結(jié)果的累加器(已 收集了流中的前n-1個項目),還有第n個元素本身。簽名也展示該函數(shù)是void,因為該操作是在原來的容器里面進行更新的,所以返回的是void 類型。按照需求的中的實現(xiàn)應(yīng)該是是這樣的:
public BiConsumer
這里的邏輯就是if else 邏輯判斷就是,這個key ,在map 中是否存在,如果不存在,那么我們需要給他new一個list 的實例,不然我的的數(shù)據(jù)沒有地方存儲
finisher 可從名字看出方法累積過程的最后要調(diào)用的一個函數(shù),以便將累加器對象轉(zhuǎn)換為整個集合操作的最終結(jié)果。通常來說累加器的類型也是返回的結(jié)果的類型,那么就返回identity 就可以了,如果不是的話,就行自行轉(zhuǎn)換了。在當(dāng)前需求的情況下我們的累加器和返回結(jié)果的類型是一致的,所以這里的實現(xiàn)是這樣的:
public Function
combiner 方法是將兩個累加的結(jié)果進行一個合并的過程,當(dāng)然這個過程并不是每一個collector 都會調(diào)用得到(后面會講到)
按照我們的需求,只需要將兩個累加器的,中間結(jié)果合并成為一個結(jié)果即可,所以是現(xiàn)實這樣的:
public BinaryOperator
characteristics 該方法返回一個 Characteristics 的集合,它有如下值可選
UNORDERED—— 歸約結(jié)果不受流中項目的遍歷和累積順序的影響。
CONCURRENT—— accumulator函數(shù)可以從多個線程同時調(diào)用,且該收集器可以并行執(zhí)行。如果收集器沒有標(biāo)為UNORDERED,那 它僅在用于用于無序數(shù)據(jù)源時才可以并行歸約。
IDENTITY_ FINISH—— 這表明完成器方法返回的函數(shù)是一個不改變的函數(shù),這種情況下,累加器對象將會直接用作合并過程 的最終結(jié)果。
public Setcharacteristics() { return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH)); }
最終collector 代碼合在一起就是:
public class MyCollector implements Collector>, Map >> { @Override public Supplier
調(diào)用的過程就是:
public static Map> initObjectMap() { ClassScaner classScaner = new ClassScaner(); Set set = classScaner.doScan("com.souche.datacenter.observer"); return set .stream() .filter(aClass -> SubjectAnnotationResolver.getAnnotationSubjectName(aClass) != null) .map(aClass -> { String subjectKey = SubjectAnnotationResolver.getAnnotationSubjectName(aClass); AbstractObserver abstractObserver = getBeanByClassName(aClass.getSimpleName()); return new SubjectObserver(subjectKey, abstractObserver); }).collect(new MyCollector()); }
直接在使用的地方直接new MyCollector
就可以了
以上就是如何在java 8項目中自定義collector,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。