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

📅 发布时间:2026/7/8 10:07:44 👁️ 浏览次数:
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() 方法的签名publicstaticT,R1,R2,RCollectorT,?,Rteeing(Collector?superT,?,R1downstream1,Collector?superT,?,R2downstream2,BiFunction?superR1,?superR2,Rmerger) 简单来说它做了三件事用第一个 collector 收集数据同时用第二个 collector 收集相同数据用合并函数将两个结果整合为一个结果返回 实战筛选电动车辆Electric Vehicles我们有一个Vehicle接口分别由Car和Truck两个类实现。enumColor{RED,BLUE,WHITE,YELLOW}enumEngine{ELECTRIC,HYBRID,GAS}enumDrive{WD2,WD4}interfaceVehicle{}recordCar(Colorcolor,Engineengine,Drivedrive,intpassengers)implementsVehicle{}recordTruck(Engineengine,Drivedrive,intweight)implementsVehicle{}然后我们有如下车辆列表ListVehiclevehiclesList.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包括Car和Truck并将它们合并成一个集合传统方式要写两次filter()再手动合并使用teeing()可以一气呵成一次遍历搞定✅ teeing() 示例代码ListVehicleelectricVehiclesvehicles.stream().collect(Collectors.teeing(// 第一个 collector筛选电动汽车Collectors.filtering(v-vinstanceofCarcarcar.engine()Engine.ELECTRIC,Collectors.toList()),// 第二个 collector筛选电动卡车Collectors.filtering(v-vinstanceofTrucktrucktruck.engine()Engine.ELECTRIC,Collectors.toList()),// 合并两个结果(cars,trucks)-{cars.addAll(trucks);returncars;}));System.out.println(Electric vehicles electricVehicles); 控制台输出Electricvehicles[Car[colorBLUE,engineELECTRIC,driveWD2,passengers4]]说明当前只有一辆电动汽车结果正确✅。 分析各个部分位置作用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再合并 补充示例求最大值与最小值recordPerson(Stringname,intage){}ListPersonpeopleList.of(newPerson(Alice,30),newPerson(Bob,24),newPerson(Carol,35));Map.EntryPerson,PersonminMaxpeople.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);