JAVA Stream的collect用法与原理(详解)

本文详细介绍了Java Stream的collect方法及Collector接口,通过实例展示了如何使用collect进行数据收集、分组、归约和嵌套操作。讲解了Collectors工具类提供的常见收集器,并探讨了如何开发自定义收集器,帮助提升开发效率。
摘要由CSDN通过智能技术生成

初识Collector
先看一个简单的场景:
现有集团内所有人员列表,需要从中筛选出上海子公司的全部人员

假定人员信息数据如下:

姓名 子公司 部门 年龄 工资
大壮 上海公司 研发一部 28 3000
二牛 上海公司 研发一部 24 2000
铁柱 上海公司 研发二部 34 5000
翠花 南京公司 测试一部 27 3000
玲玲 南京公司 测试二部 31 4000

如果你曾经用过Stream流,或者你看过我前面关于Stream用法介绍的文章,那么借助Stream可以很轻松的实现上述诉求:

public void filterEmployeesByCompany() {
    List<Employee> employees = getAllEmployees().stream()
            .filter(employee -> "上海公司".equals(employee.getSubCompany()))
            .collect(Collectors.toList());
    System.out.println(employees);
}


上述代码中,先创建流,然后通过一系列中间流操作(filter方法)进行业务层面的处理,然后经由终止操作(collect方法)将处理后的结果输出为List对象。


但我们实际面对的需求场景中,往往会有一些更复杂的诉求,比如说:

现有集团内所有人员列表,需要从中筛选出上海子公司的全部人员,并按照部门进行分组


其实也就是加了个新的分组诉求,那就是先按照前面的代码实现逻辑基础上,再对结果进行分组处理就好咯:

public void filterEmployeesThenGroup() {
    // 先 筛选
    List<Employee> employees = getAllEmployees().stream()
            .filter(employee -> "上海公司".equals(employee.getSubCompany()))
            .collect(Collectors.toList());
    // 再 分组
    Map<String, List<Employee>> resultMap = new HashMap<>();
    for (Employee employee : employees) {
        List<Employee> groupList = resultMap
                .computeIfAbsent(employee.getDepartment(), k -> new ArrayList<>());
        groupList.add(employee);
    }
    System.out.println(resultMap);
}


似乎也没啥毛病,相信很多同学实际编码中也是这么处理的。但其实我们也可以使用Stream操作直接完成:

public void filterEmployeesThenGroupByStream() {
    Map<String, List<Employee>> resultMap = getAllEmployees().stream()
            .filter(employee -> "上海公司".equals(employee.getSubCompany()))
            .collect(Collectors.groupingBy(Employee::getDepartment));
    System.out.println(resultMap);
}


两种写法都可以得到相同的结果:

{
    研发二部=[Employee(subCompany=上海公司, department=研发二部, name=铁柱, age=34, salary=5000)], 
    研发一部=[Employee(subCompany=上海公司, department=研发一部, name=大壮, age=28, salary=3000),              Employee(subCompany=上海公司, department=研发一部, name=二牛, age=24, salary=2000)]
}


上述2种写法相比而言,第二种是不是代码上要简洁很多?而且是不是有种自注释的味道了?
通过collect方法的合理恰当利用,可以让Stream适应更多实际的使用场景,大大的提升我们的开发编码效率。下面就一起来全面认识下collect、解锁更多高级操作吧。


collect\Collector\Collectors区别与关联


刚接触Stream收集器的时候,很多同学都会被collect,Collector,Collectors这几个概念搞的晕头转向,甚至还有很多人即使已经使用Stream好多年,也只是知道collect里面需要传入类似Collectors.toList()这种简单的用法,对其背后的细节也不甚了解。


这里以一个collect收集器最简单的使用场景来剖析说明下其中的关系:


概括来说

1️  collect是Stream流的一个 终止方法,会使用传入的收集器(入参)对结果执行相关的操作,这个收集器必须是Collector接口的某个具体实现类
2️  Collector是一个 接口,collect方法的收集器是Collector接口的 具体实现类
3️  Collectors是一个 工具类,提供了很多的静态工厂方法, 提供了很多Collector接口的具体实现类,是为了方便程序员使用而预置的一些较为通用的收集器(如果不使用Collectors类,而是自己去实现Collector接口,也可以)。
 


Collector使用与剖析


到这里我们可以看出,Stream结果收集操作的本质,其实就是将Stream中的元素通过收集器定义的函数处理逻辑进行加工,然后输出加工后的结果


根据其执行的操作类型来划

奋斗喝咖啡
关注 关注
  • 37
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
详解Java8 Collect收集Stream的方法
08-27
Java8 Collect收集Stream的方法详解 Java8 中的 Collect 收集 Stream 的方法是 Java8 中一个重要的功能,主要用于对 Stream 中的元素进行收集和处理。下面是对该方法的详细介绍。 title: 详解 Java8 Collect收集...
Java进阶】Stream 结合 Collectors 使用
不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员
12-25 1360
Collectors是Java 8中引入的一个工具类,用于对流进行汇总操作。它提供了一系列静态方法,可以将流中的元素收集到不同类型的集合中,或者进行统计、分组等操作。
讲透JAVA Streamcollect用法原理,远比你想象的更强大
是Vzn呀
07-18 2756
前面我们演示了很多Collectors工具类中提供的收集器的用法,上一节中列出来的Collectors提供的常用收集器,也可以覆盖大部分场景的开发诉求了。但也许在项目中,我们会遇到一些定制化的场景,现有的收集器无法满足我们的诉求,这个时候,我们也可以自己来实现定制化的收集器。我们知道,所谓的收集器,其实就是一个Collector接口的具体实现类。所以如果想要定制自己的收集器,首先要先了解Collector接口到底有哪些方法需要我们去实现,以及各个方法的作用与用途。当我们新建一个5个接口接口名称。...
解决Stream Collectors.toMap 当value为null时报空指针问题
最新发布
mcband的博客
08-25 417
Collectors.toMap 最终会调用 Map 的 merge 方法,这里会对value进行判空,如果为空,则抛出空指针异常。
Stream流中collect方法
李长渊的博客
05-07 1万+
Stream流中collect方法
JAVA Streamcollect用法原理
秃头的博客
11-12 2407
toList toSet toCollection toMap counting summingInt averagingInt joining maxBy minBy groupingBy partitioningBy collectingAndThen mapping
Java8 Stream流中的 collect() 方法,远比你想象中的强大
weixin_44421461的博客
08-01 5540
点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析...
Java8新特性之Stream--collect方法
qq_38530648的博客
03-01 7850
collect方法 收集(collect) collect,收集,可以说是内容最繁多、功能最丰富的部分了。从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合。 collect主要依赖java.util.stream.Collectors类内置的静态方法。 归集(toList/toSet/toMap) 因为流不存储数据,那么在流中的数据完成处理后,需要将流中的数据重新归集到新的集合里。 toList、toSet和toMap比较常用,另外还有toCollection、toCon
Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
08-19
Java 8 Stream Collectors 功能与操作方法详解 Java 8 Stream Collectors 是 Java 8 中的一个重要功能,位于 java.util.stream 包下。它提供了一系列的静态方法供我们使用,通常情况下我们可以静态导入即可使用。...
java8 streamList转换使用详解
08-18
这种方法与方法一类似,但也通过 `map` 操作符将每个 `Map` 转换为其 `entrySet`,然后再次使用 `flatMap` 和 `Collectors.toMap`。这里的 `(a, b) -> a` 合并函数同样用于处理键冲突。 ```java Map, Object> map =...
Java8中stream和functional interface的配合使用详解
08-28
Java 8 引入了 Stream API 和 Functional Interface,这两者的结合使用极大地提升了代码的简洁性和可读性。本文将深入探讨这两个概念以及它们在实际开发中的应用。 首先,Stream API 是一种用来处理数据集合的新...
Java8新特性Stream流实例详解
08-29
Java8新特性Stream流实例详解 Java 8 中引入了 Stream 流,用于操作数据源(集合、数组等)所生成的元素序列。Stream 流是数据渠道,具有声明性、可复合、可并行三个特性,使得 Stream 操作更简洁、更灵活、高效。...
JDK8辅助学习(四):Streamcollect() 方法的详细使用介绍
热门推荐
扛麻袋的少年的博客
01-10 5万+
Streamcollect() 方法的使用介绍 //1. <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner); //2....
Java函数式编程Stream.collect()方法使用小结
weixin_44729970的博客
11-23 2万+
steam():把一个源数据,可以是集合,数组,I/O channel, 产生器generator 等,转化成流。 Collectors(): 类实现了很多归约操作,例如将流转换成集合和聚合元素。通过stream().collect()方法可简单获得我们所需要的数据结构。 先创建一个prodList的集合数据 @Data public class Product { private Long id; private Integer num; private BigDecimal pr
讲透JAVA Streamcollect用法原理
m0_73330311的博客
08-18 675
前面我们演示了很多Collectors工具类中提供的收集器的用法,上一节中列出来的Collectors提供的常用收集器,也可以覆盖大部分场景的开发诉求了。但也许在项目中,我们会遇到一些定制化的场景,现有的收集器无法满足我们的诉求,这个时候,我们也可以自己来实现定制化的收集器。我们知道,所谓的收集器,其实就是一个Collector接口的具体实现类。所以如果想要定制自己的收集器,首先要先了解Collector接口到底有哪些方法需要我们去实现,以及各个方法的作用与用途。当我们新建一个。...
Java8 Stream收集器collect操作
老猫喜欢今日爬山的博客
06-29 1144
最终返回Map。: 将Stream中的元素,分为两组: predicate通过的分到key为true的组,否者分到key为false的组,然后通过downstream再对每组进行统计(得到统计结果D),最后得到并返回Map。提示: 串行流下的reduce与并行流下的reduce可能结果不一样,如果不太熟悉的话,建议使用stream的reduce(),而不使用.stream().collect(Collectors.reducing())。
关于collect.stream().collect()方法的使用
huyizeng7300的博客
05-12 1万+
** 关于collect.stream().collect()方法的使用 最近新入职了一家公司,在一个功能的时候,查看源代码逻辑,发现这个地方有点看不懂(可能是我自己太菜),我把这块代码贴出来,供大家查看. 可以看到我图中画横线的地方,参数已经传递完毕,后面的操作都是对整个list进行操作,用了如下代码 .stream().collect(Collectors.toMap(AccElement::getEle_code, accElement -> accElement, (key1...
java8 .stream().collect() 常规业务使用api
qq_44691484的博客
03-06 951
java8 .stream().collect() 常规业务使用api
list().stream().collect()
张文慧 期待每一天更好的自己
06-01 2466
list().stream().collect(Collectors.groupingby(Entity::getFild))的用法
写文章

热门文章

  • Spring boot——Actuator 详解 37298
  • 常见的10种算法 35908
  • JAVA Stream的collect用法与原理(详解) 19769
  • SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解 5051
  • Spring Boot面试题(2022最新版) 4652

最新评论

  • Spring boot——Actuator 详解

    DARENcdn: 干,收藏前还没收费

  • Bean 生命周期详解

    channingBeayu: 很用心 很详细!

  • 线程池使用的10个坑

    Toynheart: 都是干货,有例子有讲解,非常棒表情包

  • SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解

    不让我抬杠,那我拿什么理智?: 不用了,我用@Test测试进行重写和执行了

  • SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解

    不让我抬杠,那我拿什么理智?: aggregateProjectUnwind这个方法没写好

大家在看

  • 酒吧收银系统解决方案——未来之窗行业应用跨平台架构 528
  • 足浴店+闸机+智能衣柜+门票系统一体化管理系统解决方案——未来之窗行业应用跨平台架构 319

最新文章

  • 百度智能业务部java实习一面
  • Spring如何解决循环依赖?从基础到源码讲解
  • Bean 生命周期详解
2022年133篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家陕西玻璃钢雕塑制作厂家山西欧式玻璃钢雕塑订做价格洪江玻璃钢雕塑厂家校园玻璃钢雕塑怎么制作锡林郭勒盟玻璃钢雕塑玻璃钢毛坯雕塑东城区商场美陈哪家公司好最大的玻璃钢雕塑吉林玻璃钢动物雕塑厂家蚌埠特色玻璃钢雕塑珠海玻璃钢景观雕塑款式多样卡通玻璃钢动物雕塑怎么样衢州玻璃钢雕塑凳子广西仿真玻璃钢雕塑玻璃钢学校镂空雕塑公司福州园林玻璃钢雕塑厂家赣州商场美陈批发福清玻璃钢卡通人物雕塑普洱玻璃钢雕塑公司玻璃钢浮雕房地产不锈钢雕塑定做小品玻璃钢人物雕塑手工制作广东步行街玻璃钢雕塑供应商茂名定制玻璃钢动物雕塑本地玻璃钢雕塑全国发货湖北玻璃钢雕塑订做价格青海现代人物玻璃钢雕塑重庆玻璃钢雕塑家厂家温州玻璃钢雕塑摆件批发济南开业商场美陈浙江开业商场美陈有哪些香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化