collectors排序_java8特性:Collectors.groupingBy进行分组、排序等操做 (二)
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进行分组、排序等操做 (二)相关推荐
- Qt可拖拽排序表格(类似QQ好友分组排序)
1,简介 为了最佳体验,一个拖拽行排序的功能研究了几个小时.效果参考的QQ好友分组的排序. 网上查了下好像没有人发布QT版类似的代码,于是自己动手 QQ好友分组排序效果: 2,效果 这是最终效果图,有 ...
- GroupingComparator分组(辅助排序)的作用以及GroupingComparator分组案例实操
问题分析: partioner是在MapTask阶段将数据写入环形缓冲区中进行的分区操作,其目的是为了划分出几个结果文件(ReduceTask,但是partioner必须小于ReduceTask个数) ...
- java8 collectors类_java8之collectors
java8中提供了对集合进行转化,然后进行归集的的操作.这就不得不提Collectors这个类了,真的很强大,我们看示例吧. KeyAndValue a1 = newKeyAndValue().set ...
- collectors 求和_Java8中Collectors求和功能的自定义扩展
Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 起因 业务中需要将一组数据分类后收集总和,原本可以使用Collect ...
- java lambda 排序_Java8特性:Lambda表达式之概念篇
Java自诞生已经有十几个年头了,目前也已经发布了第十三个大版本,其中Java8是常用的版本中最新的一个版本.而Java8最大的特性就是:Lambda表达式.函数式接口和Stream流. 本篇我只介绍 ...
- Json数组列表中的数据分组排序、组内排序
文章目录 问题描述 方式一:先全部排序,在分组排序 方式二:使用HashMap取出来分组再组内排序 方式三:使用TreeMap取出来分组再组内排序 测试代码及耗时 问题描述 现在有一个用户信息数组,用 ...
- Linux 中使用 sort 指令分组排序详解
Linux 中使用 sort 指令分组排序详解 sort 中进行分组排序主要用到的选项为 -k,此文,我们着重于该选项的使用方式,用到的其它选项不做解释,有兴趣的同学可以查看帮助文档 1. 数据准备 ...
- mysql分组取出每组地一条数据_MYSQL实现分组排序并取组内第一条数据
一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from ( sel ...
- Qt可拖拽排序表格(解决滚动条不兼容问题,类似QQ好友分组排序)
原版链接 https://blog.csdn.net/dpsying/article/details/77206127 Qt可拖拽排序表格(类似QQ好友分组排序) 感谢博主无私分享 修改后,解决了滚动 ...
最新文章
- 6 个理由,让我不顾一切撑腰 Python!
- Java性能优化(12):最小化类和成员可访问能力
- LVS-DR模式(原理图详解)
- 文巾解题 14. 最长公共前缀
- 10亿用户之后,为什么是百度率先打破花园围墙?
- TFBOYS饭票上线引热议,骗局之外,区块链技术能重构娱乐产业吗?
- 【CCF】201909-2小明分苹果
- echarts折现变曲线_echarts将折线图改为曲线图
- 现在三十来岁的人存款大概多少?
- with ...as ...
- 16. go get
- 学习Linux让我进入了知名企业 原
- 确定权重的方法-主成分分析
- 用友u8 如何配置文件服务器,用友u8配置服务器
- 1076 Wifi密码
- ORA-12801: error signaled in parallel query server PZ99分析
- ise17.4 版本的安装
- 激光检测----激光原理简述
- 网络名人点赞重庆“智慧城市”建设
- 【UNIX网络编程】| 【03】TCP客户/服务器程序示例