在任意位置连接流



又是一个关于RxJava的问题。我这周很忙。

我有以下问题要解决的RxJava:

我有一个Model对象流,我把它转换成ViewModel对象流。一切都很直接-我只是使用map算子,它工作得很好。然而,我有一个要求-有时我需要在满足给定标准的元素之后添加假ViewModel。即:

models:     ---1----2----3----4----5----6----->
                      vvvvvvvvvvvvvvvvv
viewmodels: --A(1)-A(2)-A(3)-A(4)-A(5)-A(6)--->

现在假设我想在viewmodels流中的最后一个奇数后面添加假viewmodel:

result:     --A(1)-A(2)-A(3)-A(4)-A(5)-A(-1)-A(6)--->

我看了concatMap操作符-它允许我用更多的元素扩展给定的流,但我不确定我如何添加在任意位置添加新元素的逻辑。

EDIT:添加假模型的位置未知。选择"最后一个奇数"的情况只是作为一个例子。在实际情况下,我有更复杂的逻辑来决定假模型的去向。如果在流

中没有找到满足给定条件的项,则有可能根本不应该添加假模型。

EDIT2:为了更真实,我的ModelViewModel类里面都有布尔标志。我们称这个标志为isFinished。在我的例子中,我需要在流中的最后一个"完成"项之后添加假视图模型。如果它们都没有完成-不应该添加假视图模型。最终我最多添加了一个假模型

在您的示例中,插入假ViewModel的决定取决于知道流何时完成。最后一个奇数是一个很容易处理的情况,使用buffer向前看一点。当流结束时,缓冲区的大小将不再是3,您可以检查索引,看看您是否处于奇数位置。这应该给你一个大致的概念,我把它留给你去正确地思考边缘情况:

modelsWithIndex
    .buffer(3,1)
    .concatMap(list -> {
         if (list.size()==3 || list.get(0).index % 2 == 0)
             return Observable.just(list.get(0).model);
         else  
             return Observable.just(list.get(0).model, createFakeModel());
    });

在Edit2之后,似乎到流结束的距离可以任意大,所以buffer不是要走的路。对于这种情况,我将使用rxjava-extras中的Transfomers.toListWhile()。作为参数传递的条件函数将返回false,一旦model.finished返回true,那么您可以使用.buffer(2,1).flatMap()技巧来检测最后一个列表并返回Observable.just(fakeModel).concatWith(Observable.from(list)),或者如果不是最后一个,则返回Observable.from(list)

相关内容

  • 没有找到相关文章

最新更新