又是一个关于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:为了更真实,我的Model
和ViewModel
类里面都有布尔标志。我们称这个标志为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)
。