如何将多个Flux<T>合并为Flux<T[]>?求最优实现方案
更优实现方式
方式一:使用带转换器的Flux.zip重载方法
直接利用Flux.zip支持多源+结果转换的重载版本,一步完成合并与类型转换,代码更简洁:
Flux.zip( frontLeft.getState(), frontRight.getState(), backLeft.getState(), backRight.getState(), (fl, fr, bl, br) -> new SwerveModuleState[]{fl, fr, bl, br} ) .subscribe(states -> { estimator.update(new Rotation2d(gyro.getYaw()), states); });
方式二:通用集合式合并(适合模块数量动态变化的场景)
如果模块数量不固定,可先将所有Flux<SwerveModuleState>放入集合,再通过Flux.zip合并后转换类型:
List<Flux<SwerveModuleState>> moduleStateFluxes = Arrays.asList( frontLeft.getState(), frontRight.getState(), backLeft.getState(), backRight.getState() ); Flux.zip(moduleStateFluxes) .map(list -> list.stream() .map(SwerveModuleState.class::cast) .toArray(SwerveModuleState[]::new) ) .subscribe(states -> { estimator.update(new Rotation2d(gyro.getYaw()), states); });
优势说明
- 避免了多次嵌套调用
zipWith的冗余代码,可读性和维护性更强 - 直接通过转换器生成目标类型
SwerveModuleState[],无需手动拼接数组元素 - 方式二更灵活,模块数量变化时只需调整集合内容即可
内容的提问来源于stack exchange,提问作者Ocean Moist
相关产品推荐
相关产品推荐

