如何实现Flowable逐个即时发射元素后追加最终元素?
解决方案:流式追加最终元素,无需等待全量收集
这问题我太熟悉了!你当前的写法是先把所有元素攒成List再处理,自然会等全部收集完成才输出,完全不符合“元素一到就即时发射”的需求。其实用Flowable自带的拼接操作符就能轻松搞定,根本不用绕toList的弯路。
最优实现代码
直接用concatWith操作符,把原Flowable和包含最终元素的Flowable按顺序拼接:
Flowable<String> flowable = getFlowable(); flowable.concatWith(Flowable.just("final String")) .subscribe(System.out::println);
或者用append(它是concatWith的别名,效果完全一致,写法更简洁):
Flowable<String> flowable = getFlowable(); flowable.append(Flowable.just("final String")) .subscribe(System.out::println);
为什么这个方案可行?
concatWith会严格按照顺序执行:先订阅并发射原Flowable的所有元素,每收到一个就立刻发射一个,完全不会等待全量收集;- 只有当原Flowable正常完成(所有元素都发射完毕)后,才会订阅并发射后面拼接的最终元素;
- 全程保持流式处理的特性,完美匹配你的需求:即时发射原元素 + 最后追加指定元素。
为什么原写法有问题?
你之前的toList()会先收集原Flowable的所有元素到List中,这个过程必须等原Flowable完全结束才会完成,所以必然会出现“等待全量收集”的情况,和你想要的即时发射逻辑完全相悖。
内容的提问来源于stack exchange,提问作者Searene
相关产品推荐
相关产品推荐

