首页/新闻资讯/正文详情

HoRain云--Java Stream 自定义 Collector:从 collectingAndThen 到并行收集

发布时间:2026/9/25 20:26:38 来源:云帆数科 栏目:资讯中心
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 后可以实现复杂聚合逻辑。

相关推荐

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:38

货代行业- Copilot帮你找到马上要出事的货
货代行业- Copilot帮你找到马上要出事的货

** 本文以用户主邮箱中的 Outlook Copilot Chat 为例,具体可用范围受账号、组织配置、客户端版本及邮箱类型影响。** 货代行业有一个很真实的现象,很多问题不是发生在码头,不是发生在仓库,甚至不是发生在客户现场,而是… · 2026/9/25 20:26:32

DeepSeek    LeetCode 105. 从前序与中序遍历序列构造二叉树 C语言实现
DeepSeek LeetCode 105. 从前序与中序遍历序列构造二叉树 C语言实现

思路 前序遍历顺序:[根, 左子树…, 右子树…],第一个元素一定是根。 中序遍历顺序:[左子树…, 根, 右子树…],根将中序序列分为左右两部分。 递归构造: 从前序取第一个元素作为根。在中序中找到根的位置 mid&#xff0… · 2026/9/25 20:26:26

MindSpeed LLM通信计算重叠与MC2:如何榨干昇腾芯片算力
MindSpeed LLM通信计算重叠与MC2:如何榨干昇腾芯片算力

MindSpeed LLM通信计算重叠与MC2:如何榨干昇腾芯片算力 【免费下载链接】MindSpeed-LLM 昇腾LLM分布式训练框架 项目地址: https://gitcode.com/Ascend/MindSpeed-LLM MindSpeed-LLM 是昇腾(Ascend)平台上的 LLM 分布式训练框架&#… · 2026/9/25 20:52:44

AI Agent 为什么总是忘事?我用 Graphiti 给它装了一个会记时间的知识图谱大脑
AI Agent 为什么总是忘事?我用 Graphiti 给它装了一个会记时间的知识图谱大脑

我们现在做 AI Agent,经常会遇到一个很尴尬的问题: 模型明明很聪明,但就是记不住事。 比如你跟一个 AI 助手聊了半年。 三月份你告诉它:我现在主要写 Java。五月份你又说:最近项目全部转 Go 了。到了九月份&#xff0c… · 2026/9/25 20:52:25

车型识别不准,一年多赔多少钱?
车型识别不准,一年多赔多少钱?

如果你管着一家保险机构、融资租赁公司或者车队,这笔账值得算一算:车型识别偏差,一年到底吃掉多少成本?先看保险侧。车型决定了基准保费和赔付基准,车型定错,费率就套错了。把高配车按低配投保,… · 2026/9/25 20:52:13

2026-09-24:统计范围内的好整数。用go语言,有三个整数 l、r、k。 对于一个整数,把它写成十进制形式后,如果任意两个挨着的数字之间的差的绝对值都不超过 k,就认为这个整数满足条件。
2026-09-24:统计范围内的好整数。用go语言,有三个整数 l、r、k。 对于一个整数,把它写成十进制形式后,如果任意两个挨着的数字之间的差的绝对值都不超过 k,就认为这个整数满足条件。

2026-09-24:统计范围内的好整数。用go语言,有三个整数 l、r、k。 对于一个整数,把它写成十进制形式后,如果任意两个挨着的数字之间的差的绝对值都不超过 k,就认为这个整数满足条件。 现在需要统计从 l 到 r 这个闭区间… · 2026/9/25 20:51:47

yichen-skills 开发者指南:从 SKILL.md 到脚本,自建一个 AI Agent 技能全流程
yichen-skills 开发者指南:从 SKILL.md 到脚本,自建一个 AI Agent 技能全流程

yichen-skills 开发者指南:从 SKILL.md 到脚本,自建一个 AI Agent 技能全流程 【免费下载链接】yichen-skills 项目地址: https://gitcode.com/gh_mirrors/yi/yichen-skills yichen-skills 是一个面向内容创作者的开源 AI Agent 技能仓库&#x… · 2026/9/25 20:51:47

Atlas 300V推理加速卡上的YOLO部署实践:从模型转换到性能调优
Atlas 300V推理加速卡上的YOLO部署实践:从模型转换到性能调优

Atlas 上的 YOLO 部署指南:从硬件认知到推理落地最近后台一直有朋友在问 Atlas 300V 24G 到底是不是运算加速卡,又要怎么在它上面跑 YOLO。这批问题特别集中,今天干脆把这块卡和整套部署流程一次说清楚。Atlas 300V 24G 是运算加速卡&#xf… · 2026/9/25 20:51:21

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码