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
)
简单来说,它做了三件事:
- 用第一个 collector 收集数据
- 同时用第二个 collector 收集相同数据
- 用合并函数将两个结果整合为一个结果返回
实战:筛选电动车辆(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, ),
(Engine.GAS, Drive.WD4, ),
(Engine.GAS, Drive.WD2, )
);


