Rx java RxJava:创建一个自相关流

Rx java RxJava:创建一个自相关流,rx-java,rx-java2,Rx Java,Rx Java2,比如说,我想在RxJava中创建一个可观察的,它有一个反馈耦合,如下图所示 通过使用主题,我成功地做到了这一点,比如: // Observable<Integer> source = Observable.range(0, 6); public Observable<Integer> getFeedbackSum(Observable<Integer> source) { UnicastSubject<Integer> feedback

比如说,我想在RxJava中创建一个
可观察的
,它有一个反馈耦合,如下图所示

通过使用主题,我成功地做到了这一点,比如:

// Observable<Integer> source = Observable.range(0, 6);

public Observable<Integer> getFeedbackSum(Observable<Integer> source) {
    UnicastSubject<Integer> feedback = UnicastSubject.create();
    Observable<Integer> feedbackSum = Observable.zip(source, feedback.startWith(0), Pair::create)
        .map(pair -> pair.first + pair.second);

    feedbackSum.subscribe(feedback);
    return feedbackSum;
}
//可观测源=可观测范围(0,6);
公众可观察的GetFeedbackum(可观察的来源){
UnicastSubject反馈=UnicastSubject.create();
Observable feedbackSum=Observable.zip(source,feedback.startWith(0),Pair::create)
.map(配对->配对第一+配对第二);
反馈。订阅(反馈);
返回反馈;
}

它看起来很难看。有更好的方法吗?

有一个操作符:

公共最终可观察扫描(R初始值,双功能累加器)

如果累加器类型不是不可变的,则可以使用:

public final Observable scanWith(可调用种子供应商、双功能累加器)


有一个接线员:。是的,完全忽略了它。谢谢,@akarnokd
scanWith
示例:
static int initial=1。。。。可观察范围(1,2).scanWith(()->initial++,(a,b)->a+b).重复(2).订阅(out::println)。结果:1,2,4,2,3,5
Observable.range(0, 6)
    .scan(0, (a, b) -> a + b)
    .test()
    .assertResut(0, 1, 3, 6, 10, 15, 21);