尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
HoRain云--Java Stream 自定义 Collector:从 collectingAndThen 到并行收集
本文讲解 Java Stream Collector 原理包括内置收集器、自定义 Collector、combiner、并行收集和实战案例。正文1. Collector 接口java复制下载public interface CollectorT, A, R { SupplierA supplier(); BiConsumerA, T accumulator(); BinaryOperatorA combiner(); FunctionA, R finisher(); SetCharacteristics characteristics(); }T元素类型A累加器类型R结果类型2. 内置收集器java复制下载list.stream().collect(Collectors.toList()); list.stream().collect(Collectors.toSet()); list.stream().collect(Collectors.toMap(User::getId, User::getName)); list.stream().collect(Collectors.groupingBy(User::getCity)); list.stream().collect(Collectors.joining(, )); list.stream().collect(Collectors.counting());3. 自定义 Collectorjava复制下载public class ImmutableListCollectorT implements CollectorT, ListT, ListT { public SupplierListT supplier() { return ArrayList::new; } public BiConsumerListT, T accumulator() { return List::add; } public BinaryOperatorListT combiner() { return (a, b) - { a.addAll(b); return a; }; } public FunctionListT, ListT finisher() { return Collections::unmodifiableList; } public SetCharacteristics characteristics() { return Collections.emptySet(); } }使用java复制下载ListString result stream.collect(new ImmutableListCollector());4. Collector.of 简化java复制下载CollectorUser, ?, MapString, Integer collector Collector.of( HashMap::new, (map, user) - map.merge(user.getCity(), 1, Integer::sum), (m1, m2) - { m2.forEach((k, v) - m1.merge(k, v, Integer::sum)); return m1; } );5. CharacteristicsCONCURRENT并行时可多线程累加同一容器。UNORDERED不保证顺序。IDENTITY_FINISHfinisher 为恒等函数。6. collectingAndThenjava复制下载ListString unmodifiable list.stream() .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));7. teeingJava 12同时收集两个结果java复制下载record Stats(long count, double sum) {} Stats stats list.stream().collect(Collectors.teeing( Collectors.counting(), Collectors.summingDouble(Item::getPrice), Stats::new ));8. 实战分组后排序java复制下载MapString, ListUser result users.stream() .collect(Collectors.groupingBy( User::getCity, Collectors.collectingAndThen( Collectors.toList(), list - list.stream() .sorted(Comparator.comparing(User::getAge)) .toList() ) ));9. 并行收集java复制下载MapString, Long counts list.parallelStream() .collect(Collectors.groupingByConcurrent(User::getCity, Collectors.counting()));并行时使用groupingByConcurrent提升性能。10. 常见坑自定义 Collector 未正确实现 combiner并行结果错误。使用有状态 lambda。toMap 键冲突未处理。并行流与线程安全容器混用。11. 总结自定义 Collector 让 Stream 收集更灵活。理解 supplier、accumulator、combiner、finisher 后可以实现复杂聚合逻辑。
RELATED

相关推荐

HoRain云--Spring Boot 配置管理进阶:多环境、加密、动态刷新与配置中心

HoRain云--Spring Boot 配置管理进阶:多环境、加密、动态刷新与配置中心

本文讲解 Spring Boot 配置管理,包括 profile、外部化配置、Jasypt 加密、Nacos 配置中心和动态刷新。正文:1. 配置文件优先级命令行 > 环境变量 > application-{profile}.yml > application.yml。2. 多环境配置yaml复制下载# application.yml …

📅 2026/9/25 20:26:49
一个.class文件是怎么被JVM跑起来的?类加载机制+双亲委派一篇讲透

一个.class文件是怎么被JVM跑起来的?类加载机制+双亲委派一篇讲透

一个 .class 文件是怎么被 JVM 跑起来的?类加载机制 双亲委派一篇讲透 你写的 Java 代码编译成 .class 之后,JVM 到底对它做了什么,才能让它真正跑起来? 为什么静态代码块只执行一次?为什么你自己写一个 java.lang.St…

📅 2026/9/25 20:26:49
网盘资源管理实战:从EVA剧场版收藏到跨平台文件同步与备份

网盘资源管理实战:从EVA剧场版收藏到跨平台文件同步与备份

1. 从一部剧场版动画说起:为什么老片子的资源管理值得单独聊《EVA新世纪福音战士剧场版:终》这部片子,对很多动漫爱好者来说不只是一部电影,它更像是一个跨越二十多年的句号。2021年上映之后,围绕它的讨论从剧情解读延…

📅 2026/9/25 20:21:49
MORE NEWS

更多资讯

📰

PL/SQL Developer免Oracle客户端实战配置指南

简介:PLSQL Developer是一款专为Oracle数据库设计的集成开发环境,这份免安装版本省去了完整Oracle客户端的部署步骤,解压即可运行,适合追求轻量化环境的数据库开发、运维及测试人员,也适合在受限网络或快速交付场景下使…

📰

多功能在线报价系统开发实战:PHP+MySQL实现从数据表到PDF导出

简介:多功能在线报价系统源码是一套基于ASP与SQL数据库的Web应用,面向需要在线询价、报价管理的企业或个人开发者,系统围绕产品、品牌、分类、账户与报价记录五大模块构建,支持动态价格调整、批量折扣、订单跟踪、支付整合及简单的…

📰

Cocos Creator回合制战斗系统:调度器与状态机设计实战

简介:CocoKnightManager 是一套基于 Cocos Creator 的开源回合制游戏系统设计,面向希望快速搭建回合制战斗框架的开发者与学习者。它围绕模块化与数据驱动思路,将回合管理器、行动规则引擎、状态机等核心组件拆分实现,帮助解决回合…

📰

Substrate 区块链开发实战:从模块化架构到 Pallet 开发与升级

1. 从零认识 Substrate:它到底是什么,能解决什么问题第一次听到 Substrate 这个词,很多人会以为是某个前端框架或者构建工具,其实它是一套用于构建区块链底层网络的开发框架。你可以把它理解成“区块链世界的操作系统内核”——它…

📰

CRMEB 标准版系统(Java)v3.2 公测版发布

CRMEB 标准版系统(Java)v3.2 公测版发布!此次,v3.2主要围绕真实使用过程中的关键环节进行了集中优化:部署更省事了:两个部署包合并成一个JAR,一个文件就能启动;后台接入AI MCP能力&a…

📰

嵌入式驱动开发到底忙啥?设备树与内核宏实战解析

1. 被问“你一天到晚到底在忙啥”时,我该怎么回答“嵌入式驱动开发忙啥咧”——这句话我第一次听到,是家里亲戚问的。当时我正对着串口日志调一个 I2C 触摸屏的 probe 失败问题,头也没抬地回了一句“就是让硬件能跑起来”。对方一脸茫然&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬