Java8函数式编程(4)--collector(收集器)
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(收集器)相关推荐
- Java8中字符串连接(join)收集器 Collectors.joining
** Java8中的字符串连接收集器 ** 在JDK8中,可以采用函数式编程(使用 Collectors.joining 收集器)的方式对字符串进行更优雅的连接. Collectors.joining ...
- java8 函数式编程_如何使用Java 8函数式编程生成字母序列
java8 函数式编程 我偶然发现了用户" mip"一个有趣的堆栈溢出问题 . 问题是: 我正在寻找一种生成字母序列的方法: A, B, C, ..., Z, AA, AB, AC ...
- java8 函数式编程_Java 8函数式编程:延迟实例化
java8 函数式编程 单例通常会延迟实例化自己,有时,如果对象足够重,则可以延迟实例化类字段. 通常,在走惰性路线时,getter方法(或accessor )必须具有一段代码,该代码块在返回对象之前 ...
- [2017.02.23] Java8 函数式编程
以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...
- java8 函数式编程_使用Javaslang进行Java 8中的函数式编程
java8 函数式编程 我们非常高兴地在jOOQ博客上宣布一个客座帖子,该帖子由HSH Nordbank的高级软件工程师Daniel Dietrich (三人的丈夫和父亲)撰写. 他目前作为项目负责人 ...
- java8 函数式编程_您必须学习Java 8的函数式编程吗?
java8 函数式编程 我最近一直在研究Java 8,并掌握了Manning出版的" Java 8 In Action" . 让我印象深刻的第一件事是Java 8独特的销售主张是函 ...
- Java8函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- Java8函数式编程_8--设计和架构的原则
1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...
- Java8函数式编程语法入门
Java8函数式编程语法入门 Java8中函数式编程语法能够精简代码. 使用Consumer作为示例,它是一个函数式接口,包含一个抽象方法accept,这个方法只有输入而无输出. 现在我们要定义一个C ...
- Java8函数式编程_9--使用Lambda表达式编写并发程序
1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...
最新文章
- SAP 操作,弹出报错 - 已根据规则拒绝服务器触发的操作,是否要查看上个通讯步骤中触发的操作列表 -
- hdu1166敌兵布阵 树状数组裸题
- 【c++】0.C++笔记
- python中 lambda, map ,filter ,reduce讲解
- 多线程相关的一些知识点
- 计算机网络管理员五级试题,计算机网络管理员考试试题库和答案.doc
- DIV+CSS 让同一行的图片和文字对齐
- lintcode:合并排序数组
- css3 animation动画事件
- 深入理解计算机系统(1.3)------操作系统的抽象概念
- oracle 查询数据库表空间大小和剩余空间
- 关于cknife与burpsuite对java的版本需求的冲突机器解决办法
- ARP攻击实战以及防御手段
- OpenCV-Python+Moviepy 结合进行视频特效处理
- zone在linux中的含义,linux-日常运维-firewalld的9个zone
- ubuntu安装Google输入法
- Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java14 的新特性
- MSOCache(转载)
- 笔记十一:提升高效技术领导的创新能力
- android高仿美团筛选控件,Android高仿美团首页分类按钮