RxJava技术问询:Observable发射Long值遇>0时终止并触发onComplete
嘿,你的这个临时方案虽然能实现需求,但依赖外部状态变量的做法并不够Rx化,还可能存在线程安全风险(毕竟你切换了IO和主线程)。其实用RxJava内置的操作符就能更优雅、更安全地解决问题,完全不需要额外的外部变量。
更优的实现方式
核心思路是用两个操作符组合完成需求:
filter():先筛选出所有大于0的Long值take(1):只取第一个符合条件的元素,一旦取到就立即终止Observable流并触发onComplete()
这样整个流的语义非常清晰,而且是纯Rx的无状态实现,避免了线程安全问题,同时还能自动终止上游的订阅,减少不必要的资源消耗。
修改后的完整代码如下:
methodA() .subscribeOn(Schedulers.io()) .flatMapObservable(list -> Observable.from(list)) .flatMap(eachObject -> methodB(eachObject)) // 新增操作符:筛选出大于0的Long,然后只取第一个 .filter(mId -> mId > 0) .take(1) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Long>() { @Override public void onCompleted() { // 拿到第一个大于0的mId后会自动触发这里 // some callbacks } @Override public void onError(Throwable e) { // just say error } @Override public void onNext(Long mId) { // 这里只会收到第一个符合条件的mId,直接使用即可 // 再也不需要维护外部的id变量啦 } });
为什么这个方案更好?
- 无外部状态:去掉了线程不安全的外部
id变量,代码更健壮 - 语义明确:
filter和take(1)的组合一看就知道是要找第一个符合条件的元素并终止流,可读性拉满 - 资源高效:
take(1)会在取到元素后立即取消上游的订阅,避免上游继续做无用的工作,比原方案更节省资源
内容的提问来源于stack exchange,提问作者SRKS
相关产品推荐
相关产品推荐

