简介
JDK12为java.util.stream.Collectors添加了一个新的teeing方法,怎么翻译呢?看到很多人都把它翻译成“发球台”,我不禁潸然泪下,哪里有那么复杂,tee就是T。它的作用就像是一个T型,数据从两头进入,然后从一头流出。teeing的作用也就在此。
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
到此这篇关于JDK12的新特性之teeing collectors的文章就介绍到这了,更多相关jdk新特征teeing collectors内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍浅析JDK12的五大重要新特性(推荐),包括了浅析JDK12的五大重要新特性(推荐)的使用技巧和注意事项,需要的朋友参考一下 JDK12的五大重要新特性 Java12在March 19, 2019发布了。 在2017年发布Java 9之后,Java平台发布节奏已从每3年以上的主要版本转变为每6个月发布一次功能。现在,每年的3月和9月都会发布新的版本功能。 从而提供了更细化,更快和可管
本文向大家介绍Angular6新特性之Angular Material,包括了Angular6新特性之Angular Material的使用技巧和注意事项,需要的朋友参考一下 Angular Material是包含Navigation/Dashboard/Table三种图形类型,这篇文章中将会了解一些其使用的方式。 准备:安装Material 进入到上篇文章创建的demo2,使用ng add进行安
本文向大家介绍浅谈ECMAScript6新特性之let、const,包括了浅谈ECMAScript6新特性之let、const的使用技巧和注意事项,需要的朋友参考一下 第一次写博客有点紧张,如果说的不对的地方,欢迎大家留言指正。咱们先来说说“ECMAScript”这到底是啥玩意儿?它和javascript的关系又是如何的?首先,在1996年11月的时候,javascript的创造者(网景公司Net
本文向大家介绍ThinkPHP3.1新特性之多层MVC的支持,包括了ThinkPHP3.1新特性之多层MVC的支持的使用技巧和注意事项,需要的朋友参考一下 1.模型(Model)层:默认的模型层由Model类构成,但是随着项目的增大和业务体系的复杂化,单一的模型层很难解决要求,从3.1开始推出了多层Model的支持,设计思路很简单,不同的模型层仍然都继承自系统的Model类,但是在目录结构和命名规
本文向大家介绍ThinkPHP3.1新特性之G方法的使用,包括了ThinkPHP3.1新特性之G方法的使用的使用技巧和注意事项,需要的朋友参考一下 长期以来ThinkPHP都是需要通过debug_start、debug_end方法甚至Debug类才能完成那些调试的功能,而在ThinkPHP3.1版本中,这些复杂的功能被一个简单的G方法取代了,这不可不谓是一次华丽升级。 G方法的作用包括标记位置和区
本文向大家介绍HTML5的新特性相关面试题,主要包含被问及HTML5的新特性时的应答技巧和注意事项,需要的朋友参考一下 (1) 绘画canvas (2) 用于媒介回放的video和audio元素 (3) 本地离线存储localStorage长期存储数据,浏览器关闭后数据不丢失 (4) sessionStorage的数据在浏览器关闭后自动删除 (5) 语义化更好的内容元素,比如article,foo