如何避免在RxJava的Lambda中返回输入参数?代码优化求助
优雅优化RxJava代码的几种方案
我完全理解你的感受——在flatMap里做完持久化操作后还要手动用Single.just(player)把原对象包起来,确实显得冗余又不够简洁。下面几个方案可以帮你摆脱这种写法,同时满足所有需求:
方案1:使用Completable.toSingleDefault()
这是最直接的替代方案,利用RxJava内置操作符把完成后的Completable转换成发射原Player对象的Single:
return Observable.just(player1, player2) .doOnNext(player -> player.status = // 在这里修改状态) .flatMap(player -> playersDao.savePlayerCompletable(player) .toSingleDefault(player) // 完成后自动发射传入的player ) .toFlowable(BackpressureStrategy.BUFFER); // 根据业务选择合适的背压策略
toSingleDefault(player)会在Completable成功执行完成后,将传入的Player对象作为Single的唯一发射值,完美替代了andThen(Single.just(player))的写法,代码更紧凑。
方案2:使用Single.fromSupplier()延迟提供对象
如果希望更明确地表达“保存完成后返回原对象”的逻辑,可以用fromSupplier来包裹原对象:
return Observable.just(player1, player2) .doOnNext(player -> player.status = // 修改状态) .flatMap(player -> playersDao.savePlayerCompletable(player) .andThen(Single.fromSupplier(() -> player)) ) .toFlowable(BackpressureStrategy.LATEST);
这个方案和方案1效果一致,但fromSupplier会延迟获取Player对象(虽然这里是立即返回,但语义上更清晰),如果你的Player对象在保存过程中可能有后续修改(不过你的场景里是先修改状态再保存,所以影响不大),这个写法会更严谨。
方案3:封装复用逻辑(可选)
如果这个保存后返回对象的逻辑在多处用到,可以封装成一个通用的工具方法,让代码更整洁:
// 通用工具方法 private <T> Single<T> saveAndReturn(T item, Completable saveAction) { return saveAction.toSingleDefault(item); } // 使用时的代码 return Observable.just(player1, player2) .doOnNext(player -> player.status = // 修改状态) .flatMap(player -> saveAndReturn(player, playersDao.savePlayerCompletable(player))) .toFlowable(BackpressureStrategy.DROP);
这样后续再遇到类似场景,直接调用saveAndReturn即可,减少重复代码。
关键注意点
- 所有方案都不会修改
savePlayerCompletable的返回类型,完全符合你的要求; - 最终通过
toFlowable()转换时,要根据你的业务场景选择合适的背压策略(比如BUFFER、LATEST、DROP); - 每个修改状态后的Player对象都会在保存操作完成后被发射,不会丢失任何对象。
内容的提问来源于stack exchange,提问作者Alex Kokorin
相关产品推荐
相关产品推荐

