JDK12的新特性:teeing collectors
简介
JDK12为java.util.stream.Collectors添加了一个新的teeing方法,怎么翻译呢?看到很多人都把它翻译成“发球台”,我不禁潸然泪下,哪里有那么复杂,tee就是T。它的作用就像是一个T型,数据从两头进入,然后从一头流出。teeing的作用也就在此。
更多内容请访问www.flydean.com
talk is cheap, show me the code
我最喜欢的就是一言不合上代码,文字的描述总是让人有点摸不着头脑,程序员还是要用程序说话。有了程序就有了逻辑,有了逻辑一切都有了。
各大网站上的例子都喜欢举maxBy和minBy的例子,我这里偏不,下面举一个统计学生平均分数和总分数的例子,希望大家能够喜欢:
@Test
public void useTeeing(){
List<Student> studentList= Arrays.asList(
new Student("alice", 90),
new Student("boy", 20),
new Student("bruce", 40),
new Student("batman", 100)
);
String teeingResult=studentList.stream().collect(
Collectors.teeing(
Collectors.averagingInt(Student::getScore),
Collectors.summingInt(Student::getScore),
(s1,s2)-> s1+ ":"+ s2
)
);
log.info(teeingResult);
}
好了,代码来了,上面我构建了一个Student的List。然后通过Collectors.teeing操作,传入了averagingInt和summingInt,最后通过一个merge表达式生成了最后的字符串。
我们看下输出结果:
[main] INFO com.flydean.TeeingCollector - 62.5:250
Teeing方法深度剖析
作为一个有追求的程序员,不深入了解下T的本质,肯定是睡不着的。我们看下T的定义:
public static <T, R1, R2, R>
Collector<T, ?, R> teeing(Collector<? super T, ?, R1> downstream1,
Collector<? super T, ?, R2> downstream2,
BiFunction<? super R1, ? super R2, R> merger)
首先分析一下T方法的返回值,T返回一个Collector。Collector是一个Reduction operations。它将输入的元素经过累计之后转换成为一个结果集合。
我们再看一下Collector接口的定义:
public interface Collector<T, A, R>
Collector定义了三个参数类型,T是输入元素的类型,A是reduction operation的累加类型也就是Supplier的初始类型,R是最终的返回类型。 我们画个图来看一下这些类型之间的转换关系:

Stream中的A和Supplier中的A经过accumulator和combiner,最终在finisher中转换成R。
T方法需要传入两个downstream,这两个downstream是两个Collector,可以看到两者的返回类型是可以不同的。
最后一个merger将R1和R2两种类型转换成了最终的返回类型R。
Characteristics
最后讲一下Characteristics,Characteristics是指Collector的特征。
Characteristics是为了更好的执行collector的reduce操作。
比如,如果Characteristics是UNORDERED,则表示Collector在处理过程中并不保存元素的顺序,是没有顺序的。
如果Characteristics是CONCURRENT,则表示Collector会处理多线程的问题,而不需要Stream API来考虑。
因为T方法的前面两个参数是Collector,并且最后也返回一个Collector。
那么如果downstream1和downstream2都是UNORDERED,T最后返回的Collector也是UNORDERED的。
如果downstream1和downstream2都是CONCURRENT,T最后返回的Collector也是CONCURRENT的。
总结
上面就是T的所有介绍了。
本文的例子https://github.com/ddean2009/learn-java-base-9-to-20
本文作者:flydean程序那些事
本文链接:http://www.flydean.com/jdk12-teeing-collectors/
本文来源:flydean的博客
欢迎关注我的公众号:程序那些事,更多精彩等着您!
JDK12的新特性:teeing collectors的更多相关文章
- Java8新特性之Collectors
参考:Java8新特性之Collectors 在第二天,你已经学习了Stream API能够让你以声明式的方式帮助你处理集合.我们看到collect是一个将管道流的结果集到一个list中的结束操作.c ...
- java8 array、list操作 汇【3】)(-Java8新特性之Collectors 详解
//编写一个定制的收集器 public static class MultisetCollector<T> implements Collector<T, Multiset<T ...
- Java 8 新特性 用 Collectors 对 List 去重
场景:有一个实体的List集合,需要根据实体中的某个字段对List去重 Collectors.collectingAndThen方法:将流中的数据通过Collector计算,计算的结果再通过Funct ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- JDK10、JDK11、JDK12新特性
JDK10新特性 1.var声明变量 很多人抱怨Java是一种强类型,需要引入大量的样板代码.甚至在这些情况下,给定好变量名,通常很清楚发生了什么,明显类型声明往往被认为是不必要的.许多流行的编程语言 ...
- JDK12的五大重要新特性
文章目录 JDK12的五大重要新特性 引入JVM常量API 扩展了switch语句 支持Unicode 11.0 为日本Reiwa Era提供了方形字符支持 NumberFormat增加了对以紧凑格式 ...
- Java程序员必备基础:JDK 5-15都有哪些经典新特性
前言 JDK 15发布啦~ 我们一起回顾JDK 5-15 的新特性吧,大家一起学习哈~ 本文已经收录到github ❝ https://github.com/whx123/JavaHome ❞ 「公众 ...
- 一文带你看遍 JDK9~14 的重要新特性!
Java9 发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块系统的引入,其他还有诸如 ...
- Java9至17的新特性总结
总览 讲讲Java 9-17 的一些语法糖和一些新发布的jeps, 重点讲讲JVM的垃圾回收器 时间线 SpringBoot 为什么选择Java17这个版本.我估计跟下面这个图有关系. Java 8 ...
- 从Java 9 到 Java 17 新特性梳理
Java 9 新的创建集合的方法 // [1, 2, 3, 4] List<Integer> integers = List.of(1, 2, 3, 4); // {1,2,3} ...
随机推荐
- easyexcel: The maximum length of cell contents (text) is 32,767 characters
easyexcel The maximum length of cell contents (text) is 32,767 characters 使用easyexcel向excel中写内容出现了单元 ...
- Execl常用快捷操作
常用的操作 Ctrl+A 全选 Ctrl+Z 撤销 Ctrl+X 剪切 Ctrl+C 复制 Ctrl+V 粘贴 Ctrl+B 加粗 Ctrl+S 保存 Ctrl+F 查找 Ctrl+H 替换 Alt+ ...
- Java Reactive Programming
Java Reactive Programming 响应式编程 在 Spring Boot 中,支持了响应式编程,带来了性能和内存使用方面的优化. 详见: Spring: Blocking vs no ...
- Jenkins+maven+svn+tomcat持续集成环境
前言 团队最近要把项目发布的工作拿过来,所以需要一个持续集成发布系统 直接上步骤. 下载 http://mirrors.jenkins-ci.org/war/latest/ 直接下载war包,我下载的 ...
- 【Azure 事件中心】Kafka 生产者发送消息失败,根据失败消息询问机器人得到的分析步骤
问题描述 Azure Event Hubs -- Kafka 生产者发送消息存在延迟接收和丢失问题, 在客户端的日志中发现如下异常: 2023-06-05 02:00:20.467 [kafka-pr ...
- 【Azure 事件中心】向Event Hub发送数据异常 : partitionId[null]: Sending messages timed out
问题描述 在使用Java 代码向 Azure Event Hub发送数据时,先后遇见了如下两种异常消息: 1)ERROR c.t.d.h.s.source.EventHubLogConsumer - ...
- 【Azure 环境】当在Azure 环境中调用外部接口不通时,如何定位SSL Certificate Problem
问题描述 如果在Azure VM中,发现同一个API,一台VM可以访问成功,另外一台访问失败.如何来调试并定位问题呢? 问题分析 第一步,查看访问外部API不通时候出现什么错误.如果没有明确的错误消息 ...
- linux的简单使用
了解Linux的简单使用 Linux的安装 下载Linux Ubuntu版本和虚拟机VMware软件. 我已经提前下载好了,下载好的文件分享出来bd 这个是文件夹内的VMWare软件的注册码,安装完成 ...
- python网络爬虫从入门到实战开发
1.简单的抓取网页 from urllib import requestreq=request.Request("http://www.baidu.com")response=re ...
- Python回顾面向对象
[一]面向过程开发和面向对象开发 [1]面向过程包括函数和面条 包括面条版本一条线从头穿到尾 学习函数后开始对程序进行分模块,分功能开发 学习模块化开发,我们就可以对我们的功能进行分类开发 建一个功能 ...