实现顺序:列表<可观察<T>> ->可观察<列表<T>>



对于每种类型T,有了一个包含n个t的可观察对象的列表,我想要构建一个可观察对象,每当一个原始的可观察对象发出一些东西时,都会发出一个包含n个t的列表。在函数式文献中,这通常被称为"序列"操作符。

伪语法中期望的行为示例:

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]

不知何故,我需要重建结果列表,而不是将新值附加到现有列表中。你们会怎么做?

感谢您的回答!

Rxx有一个超载的CombineLatest,它接受一个可观察对象的集合,并做你想要的。您应该能够相当容易地将该方法的源代码移植到Java中。

相关内容

  • 没有找到相关文章

最新更新