热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

JDK12的新特性之teeingcollectors

这篇文章主要介绍了JDK12的新特性之teeingcollectors的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

简介

JDK12为java.util.stream.Collectors添加了一个新的teeing方法,怎么翻译呢?看到很多人都把它翻译成“发球台”,我不禁潸然泪下,哪里有那么复杂,tee就是T。它的作用就像是一个T型,数据从两头进入,然后从一头流出。teeing的作用也就在此。

talk is cheap, show me the code

我最喜欢的就是一言不合上代码,文字的描述总是让人有点摸不着头脑,程序员还是要用程序说话。有了程序就有了逻辑,有了逻辑一切都有了。

各大网站上的例子都喜欢举maxBy和minBy的例子,我这里偏不,下面举一个统计学生平均分数和总分数的例子,希望大家能够喜欢:

@Test
  public void useTeeing(){
    List 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 
  Collector teeing(Collector<&#63; super T, &#63;, R1> downstream1,
  Collector<&#63; super T, &#63;, R2> downstream2,
  BiFunction<&#63; super R1, &#63; super R2, R> merger)

首先分析一下T方法的返回值,T返回一个Collector。Collector是一个Reduction operations。它将输入的元素经过累计之后转换成为一个结果集合。

我们再看一下Collector接口的定义:

public interface Collector 

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


推荐阅读
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • 使用 Vue3 Script Setup 语法糖构建双人联机俄罗斯方块
    作为一名前端开发者,Vue3 是一个不可或缺的工具。本文通过一个实战项目——双人联机俄罗斯方块,详细介绍如何利用 Vue3 的 Script Setup 语法糖进行开发,帮助读者掌握最新的前端技术。 ... [详细]
  • 本文详细记录了 MIT 6.824 课程中 MapReduce 实验的开发过程,包括环境搭建、实验步骤和具体实现方法。 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • 本文详细介绍了如何在 CentOS 7 及其衍生发行版(如 Red Hat, Oracle, Scientific Linux 7)上安装和完全卸载 GitLab。包括安装必要的依赖关系、配置防火墙、安装 GitLab 软件包以及常见问题的解决方法。 ... [详细]
  • GreenPlum采纳ShareNothing的架构,良好的施展了便宜PC的作用。自此IO不在是DW(datawarehouse)的瓶颈,相同网络的压力会大很多。然而GreenPlum的查问优化策略可能防止尽量少的网络替换。对于首次接触GreenPlum的人来说,必定耳目一新。 ... [详细]
  • 本打算教一步步实现koa-router,因为要解释的太多了,所以先简化成mini版本,从实现部分功能到阅读源码,希望能让你好理解一些。希望你之前有读过koa源码,没有的话,给你链接 ... [详细]
  • Encountering frequent mismatches during Terraform apply operations, particularly with resource attributes. ... [详细]
  • Spring Boot与Graylog集成实现微服务日志聚合与分析
    本文介绍了如何在Graylog中配置输入源,并详细说明了Spring Boot项目中集成Graylog的日志聚合和分析方法,包括logback.xml的多环境配置。 ... [详细]
  • 整理于2020年10月下旬:总结过去,展望未来Itistoughtodayandtomorrowwillbetougher.butthedayaftertomorrowisbeau ... [详细]
  • 文章目录python包-requests关于requests包安装和使用pythonrequests请求超时设置工作中遇到的常见问题整理访问https网站,报错cer ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • iOS 百度地图使用指南:基本定位与地理编码
    本文详细介绍如何在 iOS 应用中集成百度地图,实现基本的地图定位和地理编码功能。配置详情请参考官方文档:http://developer.baidu.com/map/index.php?title=iossdk ... [详细]
  • RocketMQ 运维监控实践指南
    本文详细介绍了如何实现 RocketMQ 的运维监控,包括监控平台的搭建、常用运维命令及其具体用法。适合对 RocketMQ 监控感兴趣的读者参考。 ... [详细]
  • 本文介绍了 LaiFengcode 在 GitHub 上的两个主要开源项目:SopCastComponent 和 iOS 相关组件。 ... [详细]
author-avatar
木棉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有