跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 12 Stream API:Collectors.teeing() 组合两个收集器结果

综述由AI生成介绍 Java 12 引入的 Collectors.teeing() 方法,用于将两个独立的收集器应用于同一流并合并结果。通过筛选电动车辆的示例,展示了如何一次性遍历完成不同子集的筛选与聚合。该方法适用于并行筛选、多指标计算及多路径聚合场景,能有效简化代码逻辑。

字节跳动发布于 2026/3/28更新于 2026/5/2927 浏览
Java 12 Stream API:Collectors.teeing() 组合两个收集器结果

Java 12 Stream API - 组合两个收集器的结果:Collectors.teeing()

在 Java 12 中,Collectors 工具类新增了一个强大方法:teeing()。

这个方法能让我们同时应用两个独立的收集器(Collectors)到同一个流上,并在末尾合并它们的结果。非常适用于并行筛选和聚合场景!

teeing() 方法的签名

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
)

简单来说,它做了三件事:

  1. 用第一个 collector 收集数据
  2. 同时用第二个 collector 收集相同数据
  3. 用合并函数将两个结果整合为一个结果返回

实战:筛选电动车辆(Electric Vehicles)

我们有一个 Vehicle 接口,分别由 Car 和 Truck 两个类实现。

enum Color { RED, BLUE, WHITE, YELLOW }
enum Engine { ELECTRIC, HYBRID, GAS }
enum Drive { WD2, WD4 }
interface Vehicle {}
record Car(Color color, Engine engine, Drive drive, int passengers) implements Vehicle {}
record Truck(Engine engine, Drive drive, int weight) implements Vehicle {}

然后,我们有如下车辆列表:

List<Vehicle> vehicles = List.of(
    new Car(Color.BLUE, Engine.ELECTRIC, Drive.WD2, 4),
    new Car(Color.WHITE, Engine.HYBRID, Drive.WD4, 5),
    new Truck(Engine.GAS, Drive.WD4, 12_000),
    new Truck(Engine.GAS, Drive.WD2, 8_000)
);

目标

  • 筛选出所有电动车(Electric Engine)
    • 包括 Car 和 Truck
  • 并将它们合并成一个集合

传统方式要写两次 filter(),再手动合并;使用 teeing() 可以一气呵成,一次遍历搞定!

teeing() 示例代码

List<Vehicle> electricVehicles = vehicles.stream().collect(Collectors.teeing(
    // 第一个 collector:筛选电动汽车
    Collectors.filtering(v -> v instanceof Car car && car.engine() == Engine.ELECTRIC, Collectors.toList()),
    // 第二个 collector:筛选电动卡车
    Collectors.filtering(v -> v instanceof Truck truck && truck.engine() == Engine.ELECTRIC, Collectors.toList()),
    // 合并两个结果
    (cars, trucks) -> {
        cars.addAll(trucks);
        return cars;
    }
));
System.out.println("Electric vehicles = " + electricVehicles);
控制台输出:
Electric vehicles = [Car[color=BLUE, engine=ELECTRIC, drive=WD2, passengers=4]]

说明当前只有一辆电动汽车,结果正确。

分析各个部分

位置作用
Collectors.filtering(...)对流元素进行筛选并继续收集
Collectors.toList()把筛选结果变成列表
(cars, trucks) -> { ... }用于合并两个中间结果的 BiFunction(双参数函数)

小技巧:合并函数的替代方式

如果你不想修改原始 cars 列表(即不可变合并),可以这样写:

(cars, trucks) -> Stream.concat(cars.stream(), trucks.stream()).toList()

这样 cars 和 trucks 都不被修改,返回的是新合并的结果。

teeing() 的使用场景总结

场景示例
并行筛选不同子集electric cars vs electric trucks
计算两个指标平均值 & 总和,最大值 & 最小值
多路径聚合同时 groupBy 和 count,再合并

补充示例:求最大值与最小值

record Person(String name, int age) {}
List<Person> people = List.of(
    new Person("Alice", 30),
    new Person("Bob", 24),
    new Person("Carol", 35)
);
Map.Entry<Person, Person> minMax = people.stream().collect(Collectors.teeing(
    Collectors.minBy(Comparator.comparingInt(Person::age)),
    Collectors.maxBy(Comparator.comparingInt(Person::age)),
    (minOpt, maxOpt) -> Map.entry(minOpt.orElseThrow(), maxOpt.orElseThrow())
));
System.out.println("Youngest and Oldest: " + minMax);

目录

  1. Java 12 Stream API - 组合两个收集器的结果:Collectors.teeing()
  2. teeing() 方法的签名
  3. 实战:筛选电动车辆(Electric Vehicles)
  4. 目标
  5. teeing() 示例代码
  6. 控制台输出:
  7. 分析各个部分
  8. 小技巧:合并函数的替代方式
  9. teeing() 的使用场景总结
  10. 补充示例:求最大值与最小值
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 2025 AIGC 最具影响力 AI 应用开发平台榜单及选型分析
  • 链表数据结构详解:结构、操作与应用
  • 利用 AI 实现一镜到底:将静态插图转为沉浸式全景视频
  • 飞算 JavaAI:自然语言驱动 Java 工程代码生成实践
  • Java 主流快速开发框架横评:若依、芋道、JeecgBoot 与 Jeesite
  • 深度视觉赋能足式机器人极限运动与跑酷技术解析
  • 2026 年全球 15 款主流大语言模型深度盘点
  • GitHub 热榜项目 - 日榜精选(2026-02-02)| AI 智能体、终端工具、视频生成等
  • HTTP 协议基础与 HTTPS 原理
  • AI 时代 SQL 学习指南:初级开发者如何平衡导航与直觉
  • 非技术岗转向 AI 岗位的现实评估与规划
  • Whisper 音频转录实战
  • CentOS 安装 JDK 1.8 详细步骤与配置指南
  • Lossless Scaling AI 插帧功能配置避坑与性能陷阱解析
  • Git 入门:环境配置、核心概念与文件操作
  • Qwen3-VL 基于 Llama-Factory QLoRA 训练部署全流程:Open-EQA 具身智能数据集
  • 22 个优质 Python 学习网站推荐
  • Java 二分查找算法实战:从基础到进阶
  • PID 循迹机器人控制算法实战:24 电赛 H 题解析
  • 9 篇必读的大模型前沿论文

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online