当前位置: 首页 > news >正文

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

文章目录

  • 323. Java Stream API - 组合两个收集器的结果:Java 12 中的 `Collectors.teeing()`
    • 📦 teeing() 方法的签名
    • 🚗🚚 实战:筛选电动车辆(Electric Vehicles)
    • 🎯 目标:
    • ✅ teeing() 示例代码
      • 💡 控制台输出:
    • 📌 分析各个部分
    • 🧠 小技巧:合并函数的替代方式
    • 🧰 teeing() 的使用场景总结
    • 📚 补充示例:求最大值与最小值

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

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

这个方法能让我们:

同时应用两个独立的收集器(Collectors)到同一个流上,并在末尾合并它们的结果。

非常适用于并行筛选和聚合场景


📦 teeing() 方法的签名

publicstatic<T,R1,R2,R>Collector<T,?,R>teeing(Collector<?superT,?,R1>downstream1,Collector<?superT,?,R2>downstream2,BiFunction<?superR1,?superR2,R>merger)

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

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

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

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

enumColor{RED,BLUE,WHITE,YELLOW}enumEngine{ELECTRIC,HYBRID,GAS}enumDrive{WD2,WD4}interfaceVehicle{}recordCar(Colorcolor,Engineengine,Drivedrive,intpassengers)implementsVehicle{}recordTruck(Engineengine,Drivedrive,intweight)implementsVehicle{}

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

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

🎯 目标:

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

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


✅ teeing() 示例代码

List<Vehicle>electricVehicles=vehicles.stream().collect(Collectors.teeing(// 第一个 collector:筛选电动汽车Collectors.filtering(v->vinstanceofCarcar&&car.engine()==Engine.ELECTRIC,Collectors.toList()),// 第二个 collector:筛选电动卡车Collectors.filtering(v->vinstanceofTrucktruck&&truck.engine()==Engine.ELECTRIC,Collectors.toList()),// 合并两个结果(cars,trucks)->{cars.addAll(trucks);returncars;}));System.out.println("Electric vehicles = "+electricVehicles);

💡 控制台输出:

Electricvehicles=[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()

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


🧰 teeing() 的使用场景总结

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

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

recordPerson(Stringname,intage){}List<Person>people=List.of(newPerson("Alice",30),newPerson("Bob",24),newPerson("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);
http://www.jsqmd.com/news/381112/

相关文章:

  • 2026年推力角接触球轴承厂家推荐 滚珠丝杠轴承/丝杠轴承/精密角接触球轴承/车床轴承/数控加工中心主轴 - 博客万
  • 大字符喷码机应用盘点:兼具性能与稳定性的品牌选择,喷码机/激光喷码机/大字符喷码机,大字符喷码机企业找哪家 - 品牌推荐师
  • 语音合成测试工具:多语种情感语调的边界用例生成器在软件测试中的热度解析
  • 【独家逆向分析】Seedance 2.0论文未公开的第4代一致性损失函数:L_pixel-Δ²如何规避传统SSIM陷阱?
  • 生物特征测试工具:步态识别算法的活体攻击模拟套件
  • 电商卖家福音:RMBG-2.0批量处理商品图去背景
  • 基于Qwen3-ASR-0.6B的语音翻译系统开发
  • 公众号热度全景:2026年AR测试内容的三大爆款赛道
  • 快速搭建Qwen3-ASR-0.6B语音识别服务
  • AI是怎么突然变厉害的?——2012,所有人以为他们作弊了
  • RexUniNLU极速体验:无需标注的舆情分析系统搭建
  • “Fatal error: require(): Failed opening required...” 以及如何彻底避免它再次出现
  • 春联生成模型-中文-base实操案例:社区春节晚会节目单+春联一体化生成
  • 寄生虫类型钩虫绦虫血吸虫检测数据集VOC+YOLO格式2109张8类别
  • Qwen3-ASR-0.6B部署指南:3步搭建语音转文字服务
  • 区块链性能工具:Hyperledger Caliper的TPS优化监控模块
  • Seedance 2.0上线倒计时:你的系统是否已通过像素级一致性压力测试?3分钟自检清单含11项硬性指标(含GPU显存泄漏检测阈值与NPU算力饱和预警公式)
  • 金铲铲之战人物目标检测数据集VOC+YOLO格式1575张59类别
  • HY-Motion 1.0在Web爬虫数据可视化中的应用
  • Seedance 2.0 2K分辨率卡顿归因分析:不是显卡不行,而是这3个时序同步漏洞正在 silently 损耗37.6%有效吞吐
  • 【2K实时生成倒计时】Seedance 2.0即将停更v2.x配置文档——这5个终端命令必须今天执行完毕
  • 量子算法测试工具:Qiskit噪声仿真插件开发的热度解析与专业指南
  • 工业级2K实时生成如何做到99.99%可用性?Seedance 2.0高可用集群部署实战(含K8s亲和性策略与动态降级开关配置)
  • Seedance 2.0像素一致性≠视觉一致性?揭开底层L2范数匹配→感知加权SSIM→人眼MTF响应三重校准机制(含主观评测MOS≥4.82数据集)
  • 揭秘SQL调优:索引策略与实战案例深度剖析
  • 【Seedance 2.0实时生成性能突围战】:2K分辨率下GPU利用率飙升47%的5大调优铁律
  • 三维扫描仪的用途有哪些?一文看懂工业检测、逆向工程与数字化建模 - 工业三维扫描仪评测
  • 软件工程毕业设计新颖的方向思路
  • CUDA 12.2 + cuDNN 8.9.7 + TensorRT 8.6.1 —— Seedance 2.0 2K生成唯一兼容栈(官方未公开的版本矩阵)
  • AI论文生成器有哪些?2026年6款AI论文生成神器指南,论文查重率问题解决! - 掌桥科研-AI论文写作