JDK12的新特性之teeing collectors

 更新时间:2020年05月13日 10:09:47   作者:flydean程序那些事  
这篇文章主要介绍了JDK12的新特性之teeing collectors的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

简介

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java并发应用之任务执行分析

    Java并发应用之任务执行分析

    这篇文章主要为大家详细介绍了JavaJava并发应用编程中任务执行分析的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-07-07
  • SpringBoot项目改为SpringCloud项目使用nacos作为注册中心的方法

    SpringBoot项目改为SpringCloud项目使用nacos作为注册中心的方法

    本文主要介绍了SpringBoot项目改为SpringCloud项目使用nacos作为注册中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • SpringBoot中使用AOP实现日志记录功能

    SpringBoot中使用AOP实现日志记录功能

    AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程),它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式,本文给大家介绍了SpringBoot中使用AOP实现日志记录功能,需要的朋友可以参考下
    2024-05-05
  • java8之LocalDate的使用、LocalDate格式化问题

    java8之LocalDate的使用、LocalDate格式化问题

    这篇文章主要介绍了java8之LocalDate的使用、LocalDate格式化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • java 最新Xss攻击与防护(全方位360°详解)

    java 最新Xss攻击与防护(全方位360°详解)

    这篇文章主要介绍了java 最新Xss攻击与防护(全方位360°详解),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 如何使用JFrame完成动态模拟时钟

    如何使用JFrame完成动态模拟时钟

    本文介绍了如何使用JFrame完成动态模拟时钟,需要的朋友可以参考下
    2015-08-08
  • springboot中实现上传文件的功能简单示例

    springboot中实现上传文件的功能简单示例

    这篇文章主要给大家介绍了关于springboot中实现上传文件功能的相关资料,在Spring Boot中实现文件上传下载功能相对简单,文中给出了代码示例,需要的朋友可以参考下
    2023-09-09
  • SpringBoot Redisson 集成的实现示例

    SpringBoot Redisson 集成的实现示例

    本文主要介绍了SpringBoot Redisson 集成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • java中this的n种使用方法

    java中this的n种使用方法

    this可能是几乎所有有一点面向对象思想的语言都会引用到的变量,this有多少种用法。下面小编给大家带来了java中this的n种使用方法,感兴趣的朋友一起看看吧
    2018-08-08
  • Java内部类及其特点的讲解

    Java内部类及其特点的讲解

    今天小编就为大家分享一篇关于Java内部类及其特点的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论