Stream类的函数java

R collect(Collector super T, A, R> collector);

能够对数据集进行简单的分组统计。函数参数为接口Collector,其实如今final class Collectors的内部静态类CollectorImpl。Collector接口代码以下:web

public interface Collector {

Supplier supplier();

BiConsumer accumulator();

BinaryOperator combiner();

Function finisher();

Set characteristics();

public static Collector of(Supplier supplier,

BiConsumer accumulator,

BinaryOperator combiner,

Characteristics... characteristics) {

Objects.requireNonNull(supplier);

Objects.requireNonNull(accumulator);

Objects.requireNonNull(combiner);

Objects.requireNonNull(characteristics);

Set cs = (characteristics.length == 0)

? Collectors.CH_ID

: Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH,

characteristics));

return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, cs);

}

public static Collector of(Supplier supplier,

BiConsumer accumulator,

BinaryOperator combiner,

Function finisher,

Characteristics... characteristics) {

Objects.requireNonNull(supplier);

Objects.requireNonNull(accumulator);

Objects.requireNonNull(combiner);

Objects.requireNonNull(finisher);

Objects.requireNonNull(characteristics);

Set cs = Collectors.CH_NOID;

if (characteristics.length > 0) {

cs = EnumSet.noneOf(Characteristics.class);

Collections.addAll(cs, characteristics);

cs = Collections.unmodifiableSet(cs);

}

return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, finisher, cs);

}

enum Characteristics {

CONCURRENT,

UNORDERED,

IDENTITY_FINISH

}

}

Collectors

Collectors中静态内部类实现了Collector接口,而且提供了诸如求最大值、最小值、平均值及求和等函数,能够搭配groupingBy(XXX)使用对数据集进行分组,相关函数及使用示例以下:app

1. Collectors.summingInt(XXX)

summingInt源码:

ide

/**

* 静态函数

* 返回一个Collector接口,其可用于产生输入元素‘int型和’的函数

*

*@param 输入元素类型

*@param mapper 函数,抽出须要汇总值得属性

*@return Collector ,用于产生'驱动属性'的和

*/

public static Collector

summingInt(ToIntFunction super T> mapper) {

return new Collectors.CollectorImpl<>(

() -> new int[1],//Supplier === T get();

(a, t) -> { a[0] += mapper.applyAsInt(t); },//BiConsumer === void accept(T t, U u)

(a, b) -> { a[0] += b[0]; return a; },// BinaryOperator === R apply(T t, U u)

a -> a[0], // Function === R apply(T t);

CH_NOID);// Set == int size();

}

参数ToIntFunction类源码svg

@FunctionalInterface

public interface ToIntFunction {

/**

* Applies this function to the given argument.

*

* @param value 函数参数

*/

int applyAsInt(T value);

}

返回值类所继承的接口Collector函数

/*

* 包含

* 1.返回值为函数类接口的抽象方法;

* 2.of方法返回其对象实例;

* 3.枚举类,包含

* CONCURRENT,UNORDERED,IDENTITY_FINISH三个元素

*/

public interface Collector {

Supplier supplier();

BiConsumer accumulator();

BinaryOperator combiner();

Function finisher();

Set characteristics();

/* 参数同其方法返回值类型

* 用给的三个函数类接口实例初始化Collector接口继承类Collectors.CollectorImpl实例,并返回

*/

public static Collector of(Supplier supplier,

BiConsumer accumulator,

BinaryOperator combiner,

Characteristics... characteristics) {

Objects.requireNonNull(supplier);//保证函数类接口不为null,不然抛运行时异常

Objects.requireNonNull(accumulator);//同上

Objects.requireNonNull(combiner);//同上

Objects.requireNonNull(characteristics);//同上

Set cs = (characteristics.length == 0)

? Collectors.CH_ID

: Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH,

characteristics));

return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, cs);

}

/*

* 用给的三个函数类接口实例初始化Collector接口继承类Collectors.CollectorImpl实例,并返回

*/

public static Collector of(Supplier supplier,

BiConsumer accumulator,

BinaryOperator combiner,

Function finisher,

Characteristics... characteristics) {

Objects.requireNonNull(supplier);

Objects.requireNonNull(accumulator);

Objects.requireNonNull(combiner);

Objects.requireNonNull(finisher);

Objects.requireNonNull(characteristics);

Set cs = Collectors.CH_NOID;

if (characteristics.length > 0) {

cs = EnumSet.noneOf(Characteristics.class);

Collections.addAll(cs, characteristics);

cs = Collections.unmodifiableSet(cs);

}

return new Collectors.CollectorImpl<>(supplier, accumulator, combiner, finisher, cs);

}

enum Characteristics {

CONCURRENT,

UNORDERED,

IDENTITY_FINISH

}

}

Collectors.CollectorImpl,静态内部类ui

/**

* Simple implementation class for {@code Collector}.

* 1.包含几个final变量,类型同继承接口Collector构造器参数,也同其抽象方法返回值;

* 2.两个构造器,实现方式与Collector相似;

* 3.重载的父类方法,用其变量赋值;

*/

static class CollectorImpl implements Collector {

private final Supplier supplier;

private final BiConsumer accumulator;

private final BinaryOperator combiner;

private final Function finisher;

private final Set characteristics;

CollectorImpl(Supplier supplier,

BiConsumer accumulator,

BinaryOperator combiner,

Function finisher,

Set characteristics) {

this.supplier = supplier;

this.accumulator = accumulator;

this.combiner = combiner;

this.finisher = finisher;

this.characteristics = characteristics;

}

CollectorImpl(Supplier supplier,

BiConsumer accumulator,

BinaryOperator combiner,

Set characteristics) {

this(supplier, accumulator, combiner, castingIdentity(), characteristics);

}

@Override

public BiConsumer accumulator() {

return accumulator;

}

@Override

public Supplier supplier() {

return supplier;

}

@Override

public BinaryOperator combiner() {

return combiner;

}

@Override

public Function finisher() {

return finisher;

}

@Override

public Set characteristics() {

return characteristics;

}

}

TODO放一段求平均数和求和的函数代码,彻底看不懂底层实现this

/**

*求平均数

*/

public static Collector

averagingInt(ToIntFunction super T> mapper) {

return new Collectors.CollectorImpl<>(

() -> new long[2],

(a, t) -> { a[0] += mapper.applyAsInt(t); a[1]++; },

(a, b) -> { a[0] += b[0]; a[1] += b[1]; return a; },

a -> (a[1] == 0) ? 0.0d : (double) a[0] / a[1],

CH_NOID);

}

/**

*求和

*/

public static Collector

summingInt(ToIntFunction super T> mapper) {

return new Collectors.CollectorImpl<>(

() -> new int[1],

(a, t) -> { a[0] += mapper.applyAsInt(t); },

(a, b) -> { a[0] += b[0]; return a; },

a -> a[0], CH_NOID);

}

collectors排序_java8特性:Collectors.groupingBy进行分组、排序等操做 (二)相关推荐

  1. Qt可拖拽排序表格(类似QQ好友分组排序)

    1,简介 为了最佳体验,一个拖拽行排序的功能研究了几个小时.效果参考的QQ好友分组的排序. 网上查了下好像没有人发布QT版类似的代码,于是自己动手 QQ好友分组排序效果: 2,效果 这是最终效果图,有 ...

  2. GroupingComparator分组(辅助排序)的作用以及GroupingComparator分组案例实操

    问题分析: partioner是在MapTask阶段将数据写入环形缓冲区中进行的分区操作,其目的是为了划分出几个结果文件(ReduceTask,但是partioner必须小于ReduceTask个数) ...

  3. java8 collectors类_java8之collectors

    java8中提供了对集合进行转化,然后进行归集的的操作.这就不得不提Collectors这个类了,真的很强大,我们看示例吧. KeyAndValue a1 = newKeyAndValue().set ...

  4. collectors 求和_Java8中Collectors求和功能的自定义扩展

    Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 起因 业务中需要将一组数据分类后收集总和,原本可以使用Collect ...

  5. java lambda 排序_Java8特性:Lambda表达式之概念篇

    Java自诞生已经有十几个年头了,目前也已经发布了第十三个大版本,其中Java8是常用的版本中最新的一个版本.而Java8最大的特性就是:Lambda表达式.函数式接口和Stream流. 本篇我只介绍 ...

  6. Json数组列表中的数据分组排序、组内排序

    文章目录 问题描述 方式一:先全部排序,在分组排序 方式二:使用HashMap取出来分组再组内排序 方式三:使用TreeMap取出来分组再组内排序 测试代码及耗时 问题描述 现在有一个用户信息数组,用 ...

  7. Linux 中使用 sort 指令分组排序详解

    Linux 中使用 sort 指令分组排序详解 sort 中进行分组排序主要用到的选项为 -k,此文,我们着重于该选项的使用方式,用到的其它选项不做解释,有兴趣的同学可以查看帮助文档 1. 数据准备 ...

  8. mysql分组取出每组地一条数据_MYSQL实现分组排序并取组内第一条数据

    一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from ( sel ...

  9. Qt可拖拽排序表格(解决滚动条不兼容问题,类似QQ好友分组排序)

    原版链接 https://blog.csdn.net/dpsying/article/details/77206127 Qt可拖拽排序表格(类似QQ好友分组排序) 感谢博主无私分享 修改后,解决了滚动 ...

最新文章

  1. 6 个理由,让我不顾一切撑腰 Python!
  2. Java性能优化(12):最小化类和成员可访问能力
  3. LVS-DR模式(原理图详解)
  4. 文巾解题 14. 最长公共前缀
  5. 10亿用户之后,为什么是百度率先打破花园围墙?
  6. TFBOYS饭票上线引热议,骗局之外,区块链技术能重构娱乐产业吗?
  7. 【CCF】201909-2小明分苹果
  8. echarts折现变曲线_echarts将折线图改为曲线图
  9. 现在三十来岁的人存款大概多少?
  10. with ...as ...
  11. 16. go get
  12. 学习Linux让我进入了知名企业 原
  13. 确定权重的方法-主成分分析
  14. 用友u8 如何配置文件服务器,用友u8配置服务器
  15. 1076 Wifi密码
  16. ORA-12801: error signaled in parallel query server PZ99分析
  17. ise17.4 版本的安装
  18. 激光检测----激光原理简述
  19. 网络名人点赞重庆“智慧城市”建设
  20. 【UNIX网络编程】| 【03】TCP客户/服务器程序示例

热门文章

  1. java 邮件 定时_Java定时发送邮件
  2. α版本升升备忘录下载链接
  3. query_string 查询
  4. android开发之接口回调
  5. 星巴克中国已开4家手语门店,分别位于广州、北京、杭州与上海
  6. 自学Vue3+electron(一) 配置项目
  7. leetcode:大礼包(错误思路)
  8. (4)(4.6.8) 电子调速器(ESC)校准
  9. java把以逗号分割的字符串进行截取
  10. JS(高程)最佳实践