重用部分RxJava流

时间:2018-10-04 08:39:30

标签: rx-java rx-java2 rx-kotlin rx-kotlin2

可能是rx newbee问题。

如果我有两个具有某些通用部分的rx流,是否有可能提取并重新使用它们?

这是伪代码示例:

someManager.getInfo(id) returns a Single<SometInfo>

这个好玩的方法有一个ID,应该只返回一个状态为

fun getStatus(id: String): Single<Status> =
    someManager.getInfo(id)
        .flattenAsObservable { it.items }
        .map { getSomeProp(it) } // from here
        .toList()
        .map { getStatus(it) }
        .doOnSuccess { getStatusRelay(id).accept(it) } // until here it's common

并且这个没有ID但已经有一个对象,应该检查状态是否正常

fun isStatusOk(info: SomeInfo): Single<Boolean> =
    Observable.fromIterable(info.items)
        .map { getSomeProp(it) } // from here
        .toList()
        .map { getStatus(it) }
        .doOnSuccess { getStatusRelay(id).accept(it) } // until here it's common
        .map { it == Status.OK }

提前谢谢

2 个答案:

答案 0 :(得分:1)

您还可以使用扩展功能

fun Observable<Item>.convertToSingeStatus(): Single<Status> =
        this.map { getSomeProp(it) }
            .toList()
            .map { getStatus(it) }
            .doOnSuccess { getStatusRelay(id).accept(it) }

然后

fun getStatus(id: String): Single<Status> =
someManager.getInfo(id)
    .convertToSingeStatus()
    .doOnSuccess { getStatusRelay(id).accept(it) }

答案 1 :(得分:0)

凤凰王建议使用变形金刚。我尝试了它们,经过一些实验,看来我可以正常使用了。

我创建了SingleTransformer:

private fun getStatus() =
    SingleTransformer<SomeInfo, Status> {
        it.flatMap {
            Observable.fromIterable(it.items)
                .map { getSomeProp(it) }
                .toList()
                .map { getStatus(it) }
        }
    }

然后我可以重构

fun getStatus(id: String): Single<Status> =
    someManager.getInfo(id)
        .compose(getStatus())
        .doOnSuccess { getStatusRelay(id).accept(it) }

这也是

fun isStatusOk(info: SomeInfo): Single<Boolean> =
    Single.just(info)
        .compose(getStatus())
        .doOnSuccess { getStatusRelay(id).accept(it) }
        .map { it == Status.OK }

希望它对其他人有帮助。