enum Characteristics {/***指示collector是并发的。如果一个并发collector不是unordered,则只能并发应用到非排序数据源。*/CONCURRENT,/***指示collector是unordered.归约结果不受流中项目的遍历和累积顺序的影响。*/UNORDERED,/*** 这表明finisher 方法返回的函数是一个恒等函数 ,可以被忽略,这种情况下,累加器对象将会直接用作归约过程的最终结果。这也意味着,将累加器A不加检查地转换为结果R是安全的。*Indicates that the finisher function is the identity function and* can be elided.  If set, it must be the case that an unchecked cast* from A to R will succeed.*/IDENTITY_FINISH}public final <R> R collect(Supplier<R> supplier,BiConsumer<R, ? super P_OUT> accumulator,BiConsumer<R, R> combiner) {//构造一个reduce,应用evaluate方法。return evaluate(ReduceOps.makeRef(supplier, accumulator, combiner));}public final <R, A> R collect(Collector<? super P_OUT, A, R> collector) {A container;if (isParallel()&& (collector.characteristics().contains(Collector.Characteristics.CONCURRENT))&& (!isOrdered() || collector.characteristics().contains(Collector.Characteristics.UNORDERED))) {container = collector.supplier().get();BiConsumer<A, ? super P_OUT> accumulator = collector.accumulator();forEach(u -> accumulator.accept(container, u));}else {//container = evaluate(ReduceOps.makeRef(collector));}return collector.characteristics().contains(Collector.Characteristics.IDENTITY_FINISH)? (R) container: collector.finisher().apply(container);}
    private static <I, R> Function<I, R> castingIdentity() {return i -> (R) i;}

toCollection

    public static <T, C extends Collection<T>>Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) {return new CollectorImpl<>(collectionFactory       //Supplier, Collection<T>::add    //集聚器,(r1, r2) -> { r1.addAll(r2); return r1; }  //combiner,CH_ID);}

toList--ArrayList

    public static <T>Collector<T, ?, List<T>> toList() {return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add, (left, right) -> { left.addAll(right); return left; }, CH_ID);}

toSet--HashSet

    public static <T>     Collector<T, ?, Set<T>> toSet() {return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add,(left, right) -> { left.addAll(right); return left; },CH_UNORDERED_ID);}

joining

    //使用StringBuilderpublic static Collector<CharSequence, ?, String> joining() {return new CollectorImpl<CharSequence, StringBuilder, String>(StringBuilder::new, StringBuilder::append,(r1, r2) -> { r1.append(r2); return r1; },StringBuilder::toString, CH_NOID);}public static Collector<CharSequence, ?, String> joining(CharSequence delimiter) {return joining(delimiter, "", "");}    //使用StringJoinerpublic static Collector<CharSequence, ?, String> joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix) {return new CollectorImpl<>(() -> new StringJoiner(delimiter, prefix, suffix),StringJoiner::add, StringJoiner::merge,StringJoiner::toString, CH_NOID);}    

reducing

public static <T> Collector<T, ?, Optional<T>>     reducing(BinaryOperator<T> op) {class OptionalBox implements Consumer<T> {T value = null;boolean present = false;@Overridepublic void accept(T t) {if (present) {value = op.apply(value, t);}else {value = t;present = true;}}}return new CollectorImpl<T, OptionalBox, Optional<T>>(OptionalBox::new, OptionalBox::accept,(a, b) -> { if (b.present) a.accept(b.value); return a; },a -> Optional.ofNullable(a.value), CH_NOID);}/*identity,初始值mapper,应用都每个元素的functionop,应用到mapper的返回值。*/public static <T, U>    Collector<T, ?, U> reducing(U identity,Function<? super T, ? extends U> mapper,BinaryOperator<U> op) {return new CollectorImpl<>(boxSupplier(identity),  //Supplier //accumulator,(a, t) -> { a[0] = op.apply(a[0], mapper.apply(t)); },  //combiner(a, b) -> { a[0] = op.apply(a[0], b[0]); return a; },a -> a[0]    //finisher。, CH_NOID);}private static <T> Supplier<T[]> boxSupplier(T identity) {return () -> (T[]) new Object[] { identity };}

counting

    public static <T> Collector<T, ?, Long>counting() {return reducing(0L, e -> 1L, Long::sum);}

minBy

    public static <T> Collector<T, ?, Optional<T>>minBy(Comparator<? super T> comparator) {return reducing(BinaryOperator.minBy(comparator));}

maxBy

    public static <T> Collector<T, ?, Optional<T>>maxBy(Comparator<? super T> comparator) {return reducing(BinaryOperator.maxBy(comparator));}

Java8函数式编程(4)--collector(收集器)相关推荐

  1. Java8中字符串连接(join)收集器 Collectors.joining

    ** Java8中的字符串连接收集器 ** 在JDK8中,可以采用函数式编程(使用 Collectors.joining 收集器)的方式对字符串进行更优雅的连接. Collectors.joining ...

  2. java8 函数式编程_如何使用Java 8函数式编程生成字母序列

    java8 函数式编程 我偶然发现了用户" mip"一个有趣的堆栈溢出问题 . 问题是: 我正在寻找一种生成字母序列的方法: A, B, C, ..., Z, AA, AB, AC ...

  3. java8 函数式编程_Java 8函数式编程:延迟实例化

    java8 函数式编程 单例通常会延迟实例化自己,有时,如果对象足够重,则可以延迟实例化类字段. 通常,在走惰性路线时,getter方法(或accessor )必须具有一段代码,该代码块在返回对象之前 ...

  4. [2017.02.23] Java8 函数式编程

    以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...

  5. java8 函数式编程_使用Javaslang进行Java 8中的函数式编程

    java8 函数式编程 我们非常高兴地在jOOQ博客上宣布一个客座帖子,该帖子由HSH Nordbank的高级软件工程师Daniel Dietrich (三人的丈夫和父亲)撰写. 他目前作为项目负责人 ...

  6. java8 函数式编程_您必须学习Java 8的函数式编程吗?

    java8 函数式编程 我最近一直在研究Java 8,并掌握了Manning出版的" Java 8 In Action" . 让我印象深刻的第一件事是Java 8独特的销售主张是函 ...

  7. Java8函数式编程详解

    Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...

  8. Java8函数式编程_8--设计和架构的原则

    1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...

  9. Java8函数式编程语法入门

    Java8函数式编程语法入门 Java8中函数式编程语法能够精简代码. 使用Consumer作为示例,它是一个函数式接口,包含一个抽象方法accept,这个方法只有输入而无输出. 现在我们要定义一个C ...

  10. Java8函数式编程_9--使用Lambda表达式编写并发程序

    1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...

最新文章

  1. SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
  2. hdu1166敌兵布阵 树状数组裸题
  3. 【c++】0.C++笔记
  4. python中 lambda, map ,filter ,reduce讲解
  5. 多线程相关的一些知识点
  6. 计算机网络管理员五级试题,计算机网络管理员考试试题库和答案.doc
  7. DIV+CSS 让同一行的图片和文字对齐
  8. lintcode:合并排序数组
  9. css3 animation动画事件
  10. 深入理解计算机系统(1.3)------操作系统的抽象概念
  11. oracle 查询数据库表空间大小和剩余空间
  12. 关于cknife与burpsuite对java的版本需求的冲突机器解决办法
  13. ARP攻击实战以及防御手段
  14. OpenCV-Python+Moviepy 结合进行视频特效处理
  15. zone在linux中的含义,linux-日常运维-firewalld的9个zone
  16. ubuntu安装Google输入法
  17. Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java14 的新特性
  18. MSOCache(转载)
  19. 笔记十一:提升高效技术领导的创新能力
  20. android高仿美团筛选控件,Android高仿美团首页分类按钮

热门文章

  1. 【Java并发编程】java并发框架Executor学习笔记
  2. pta_l1-6(连续因子)
  3. Java解析Excel工具类(兼容xls和xlsx)
  4. 桥梁模式和适配器模式的区别
  5. linux的网络配置
  6. FreeMarker快速上手
  7. Go语言入门指南,带你轻松学Go
  8. 新手指南:我应该学哪种编程语言?
  9. Java循环添加文件_java – 使用jGit循环提交文件
  10. 组合表头_单双斜线表头——520,想单就单,想双就双