最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 8如何自定義收集器(collector)詳解

 更新時間:2017年06月28日 10:25:01   作者:chauncy  
這篇文章主要給大家介紹了關(guān)于java 8如何自定義收集器(collector)的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

需求:

將 一個容器List<Bean> 按照一定的字段進行分組,分組過后的值為特定的BEAN 里面的屬性例如:

假定有這樣一個Bean

 public class SubjectOberser{
  private String subjectKey;
  private AbstractObserver abstractObserver;
  ...geter seter 方法...
 } 

我們需要按照 subjectKey 進行分組,分組過后的內(nèi)容 應該為這樣一個容器Map<String,List<AbstractObserver>>

map 中的key,為SubjectOberser 屬性的subjectKey,值為List<AbstractObserver>

實現(xiàn)過程

首先來看看collector 的接口定義

 public interface Collector<T, A, R> { 
   Supplier<A> supplier();
   BiConsumer<A, T> accumulator();
   Function<A, R> finisher();
   BinaryOperator<A> combiner();
   Set<Characteristics> characteristics();
 }

類型 T ,是在容器里面元素的類型

類型 A ,是accumulator 返回的類型,即是累加器的返回類型

類型 R ,是最終結(jié)果的類型

supplier 方法返回的結(jié)果必須為一個空的Supplier,也就是一個空的無參函數(shù)(簽名就是這樣的 ()->{}),在調(diào)用的時候它會創(chuàng)建一個空的累加器(accumulator)實例,供數(shù)據(jù)收集的時候使用,很明顯如果按照我們的需求試下你自己collector 這里應該返回一個 () -> new HashMap<>() ,一個Map 來收集結(jié)果

accumulator 方法返回歸約操作的函數(shù)(簽名是這樣的 (a,b)->void ),當遍歷到流中第n個元素時,這個函數(shù)執(zhí)行時會有兩個參數(shù):保存歸約結(jié)果的累加器(已 收集了流中的前n-1個項目),還有第n個元素本身。簽名也展示該函數(shù)是void,因為該操作是在原來的容器里面進行更新的,所以返回的是void 類型。按照需求的中的實現(xiàn)應該是是這樣的:

 public BiConsumer<Map<String, List<AbstractObserver>>, SubjectObserver> accumulator() {
  return (Map<String, List<AbstractObserver>> acc, SubjectObserver v) -> {
   if (acc.containsKey(v.getSubjectKey())){
    acc.get(v.getSubjectKey()).add(v.getAbstractObserver());
   }else{
    List<AbstractObserver> l = new ArrayList<>();
    l.add(v.getAbstractObserver());
    acc.put(v.getSubjectKey(),l);
   }
  };
 }

這里的邏輯就是if else  邏輯判斷就是,這個key ,在map 中是否存在,如果不存在,那么我們需要給他new一個list 的實例,不然我的的數(shù)據(jù)沒有地方存儲

finisher 可從名字看出方法累積過程的最后要調(diào)用的一個函數(shù),以便將累加器對象轉(zhuǎn)換為整個集合操作的最終結(jié)果。通常來說累加器的類型也是返回的結(jié)果的類型,那么就返回identity 就可以了,如果不是的話,就行自行轉(zhuǎn)換了。在當前需求的情況下我們的累加器和返回結(jié)果的類型是一致的,所以這里的實現(xiàn)是這樣的:

 public Function<Map<String, List<AbstractObserver>>,
     Map<String, List<AbstractObserver>>> finisher(){
   return Function.identity();
 }

combiner 方法是將兩個累加的結(jié)果進行一個合并的過程,當然這個過程并不是每一個collector 都會調(diào)用得到(后面會講到)
按照我們的需求,只需要將兩個累加器的,中間結(jié)果合并成為一個結(jié)果即可,所以是現(xiàn)實這樣的:

  public BinaryOperator<Map<String, List<AbstractObserver>>> combiner() {
  return ((Map<String, List<AbstractObserver>> map1, 
    Map<String, List<AbstractObserver>> map2) -> {
     map1.putAll(map2);
     return map1;
   });
 }

characteristics 該方法返回一個 Characteristics 的集合,它有如下值可選

    UNORDERED—— 歸約結(jié)果不受流中項目的遍歷和累積順序的影響。

    CONCURRENT—— accumulator函數(shù)可以從多個線程同時調(diào)用,且該收集器可以并行執(zhí)行。如果收集器沒有標為UNORDERED,那 它僅在用于用于無序數(shù)據(jù)源時才可以并行歸約。

    IDENTITY_ FINISH—— 這表明完成器方法返回的函數(shù)是一個不改變的函數(shù),這種情況下,累加器對象將會直接用作合并過程 的最終結(jié)果。

   public Set<Characteristics> characteristics() {
    return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH));
   }

最終collector 代碼合在一起就是:

 public class MyCollector implements Collector<SubjectObserver,
  Map<String, List<AbstractObserver>>,
  Map<String, List<AbstractObserver>>> {


  @Override
  public Supplier<Map<String, List<AbstractObserver>>> supplier() {
   return () -> new HashMap<>();
  }

  @Override
  public BiConsumer<Map<String, List<AbstractObserver>>, SubjectObserver> accumulator() {
   return (Map<String, List<AbstractObserver>> acc, SubjectObserver v) -> {
    if (acc.containsKey(v.getSubjectKey())) {
     acc.get(v.getSubjectKey()).add(v.getAbstractObserver());
    } else {
     List<AbstractObserver> l = new ArrayList<>();
     l.add(v.getAbstractObserver());
     acc.put(v.getSubjectKey(), l);
    }
   };
  }

  @Override
  public BinaryOperator<Map<String, List<AbstractObserver>>> combiner() {
   return ((Map<String, List<AbstractObserver>> map1, Map<String, List<AbstractObserver>> map2) -> {
    map1.putAll(map2);
    return map1;
   });
  }

  @Override
  public Function<Map<String, List<AbstractObserver>>, Map<String, List<AbstractObserver>>> finisher() {
   return Function.identity();
  }

  @Override
  public Set<Characteristics> characteristics() {
   return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH));
  }
 }

調(diào)用的過程就是:

 public static Map<String, List<AbstractObserver>> initObjectMap() {
 ClassScaner classScaner = new ClassScaner();
 Set<Class> 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 就可以了

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Feign+mybatisplus搭建項目遇到的坑及解決

    Feign+mybatisplus搭建項目遇到的坑及解決

    這篇文章主要介紹了Feign+mybatisplus搭建項目遇到的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • springboot如何使用thymeleaf模板訪問html頁面

    springboot如何使用thymeleaf模板訪問html頁面

    springboot中推薦使用thymeleaf模板,使用html作為頁面展示。那么如何通過Controller來訪問來訪問html頁面呢?下面通過本文給大家詳細介紹,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • IntelliJ中高效重構(gòu)的10個快捷方式詳解

    IntelliJ中高效重構(gòu)的10個快捷方式詳解

    這篇文章主要為大家介紹了IntelliJ中高效重構(gòu)的10個快捷方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Java?web實現(xiàn)購物車案例

    Java?web實現(xiàn)購物車案例

    這篇文章主要為大家詳細介紹了Java?web實現(xiàn)購物車案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 詳解SpringBoot的事務管理

    詳解SpringBoot的事務管理

    Springboot內(nèi)部提供的事務管理器是根據(jù)autoconfigure來進行決定的。接下來通過本文給大家介紹SpringBoot的事務管理相關(guān)知識,感興趣的朋友一起學習吧
    2017-04-04
  • Java 滑動窗口最大值的實現(xiàn)

    Java 滑動窗口最大值的實現(xiàn)

    這篇文章主要介紹了Java 滑動窗口最大值,給定一個數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)。感興趣的可以了解一下
    2021-05-05
  • Java正則匹配中文的方法實例分析

    Java正則匹配中文的方法實例分析

    這篇文章主要介紹了Java正則匹配中文的方法,結(jié)合實例形式分析了Java針對中文、標點及引號等匹配操作相關(guān)技巧,需要的朋友可以參考下
    2017-03-03
  • SpringBoot實現(xiàn)自定義配置文件提示的方法

    SpringBoot實現(xiàn)自定義配置文件提示的方法

    這篇文章主要介紹了SpringBoot實現(xiàn)自定義配置文件提示的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • IDEA運行導入的javaweb項目tomcat正常,但是運行失敗404問題

    IDEA運行導入的javaweb項目tomcat正常,但是運行失敗404問題

    這篇文章主要介紹了IDEA運行導入的javaweb項目tomcat正常但是運行失敗404問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • java 源碼分析Arrays.asList方法詳解

    java 源碼分析Arrays.asList方法詳解

    這篇文章主要介紹了java 源碼分析Arrays.asList方法詳解的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評論

浠水县| 紫阳县| 内黄县| 剑河县| 黑水县| 鹤山市| 楚雄市| 华宁县| 黎平县| 长寿区| 绍兴县| 社会| 黑龙江省| 辽阳县| 同仁县| 汾阳市| 于田县| 岳普湖县| 象山县| 同德县| 上饶市| 漳平市| 鹿泉市| 卢氏县| 安国市| 皮山县| 漳州市| 泸水县| 张家口市| 潮州市| 西丰县| 广东省| 泾阳县| 西乌珠穆沁旗| 郑州市| 如东县| 新乡市| 平塘县| 武威市| 临湘市| 唐海县|