实现顺序:List <observable <t>&gt; - &GT;可观察到的<列表<T>&GT; </列表<T> </可观察到的<T>

时间:2014-05-15 11:07:07

标签: functional-programming system.reactive reactive-programming rx-java

对于每种类型T, 有一个Ts的Observables列表,我想建立一个Observable,每当一个原始的Observables发出一些东西时发出一个n Ts的列表。 这经常被称为&#39;序列&#39;功能文献中的算子。

伪语法中的所需行为示例:

val o1 = BehaviourSubject.create(true)
val o2 = BehaviourSubject.create(false)
val listOfObservables = [o1,o2]

val observableOfList = sequence(listOfObservables)

observableOfList.subscribe(print)

o2.onNext(true)

// Expected output:
// [true, false]
// [true, true]

我在java中编写了以下天真的实现,这是错误的:

public static <T> Observable<List<T>> sequence(List<Observable<T>> from) {
  return fold(from, Observable.<List<T>>never().startWith(new ArrayList<T>()),
            (arrayListObservable, observable) -> {
    return Observable.combineLatest(arrayListObservable, observable, (ts, t) -> {
      ts.add(t);
      return ts;
    });
  });
}

public static <F, T> T fold(final Iterable<? extends F> elements, final T zero, final Func2<T, F, T> f) {
  T currentValue = zero;
  for (final F element : elements) {
    currentValue = f.call(currentValue, element);
  }
  return currentValue;
}

// Actual output
// [true, false]
// [true, false, true]

不知何故,我需要重建结果列表,而不是将新值附加到现有列表中。你们这些人/女士们会怎样配合它?

感谢您时间和未来的答案!

1 个答案:

答案 0 :(得分:2)

Rxx有一个CombineLatest的重载,它带有一组observable并完全按照你的意愿行事。您应该能够非常轻松地将该方法的源代码移植到Java上。