reactivex:在一种 window 函数中结合 take 和 takeLast

reactivex: taking combination of take and takeLast in a sort of window function

我是 ReactiveX 的相对新手,并且已经了解 Rx.Observable.take and Rx.Observable.takeLast to take from the beginning and end of a sequence respectively and Rx.Observable.windowWithCount 从原始可观察对象中获取可能重叠的 windows。为了好玩,我想完全使用反应运算符和传感器来编写 FFT 算法。有些算法移植起来很直观,但有些算法很难用流建模。具体来说,rfft 作用于序列的开始值和结束值,我不知道该怎么做。更具体地说,如果我有:

[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

它将被分解为可观察的 windows 个:

[[0,1,14,15],[2,3,12,13],[4,5,10,11],[6,7,8,9]]

是否有一种优雅的方法可以对任意可观察序列执行此操作?

我不得不说,我不认为对有限流使用反应式是个好主意,因为你没有任何事件可以反应,也没有任何背压。您必须知道流的长度并且它是有限的。最好的解决方案是使用带 o(1) 的数组。然而,这里有一个可能的解决方案,它会使用许多 cpu 个周期。我使用 RxJava2-RC5 进行测试。

@Test
public void ttfAlgo() throws Exception {
    Observable<Integer> ascendingOrdered = Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
            .concatWith(Observable.just(11, 12, 13, 14, 15));

    Observable<Integer> descendingOrdered = ascendingOrdered.sorted((t1, t2) -> {
        return t2.compareTo(t1);
    });

    Observable.zip(ascendingOrdered.window(2), descendingOrdered.window(2), (w1, w2) -> {
        return w1.concatWith(w2.sorted());
    }).flatMap(window -> {
        System.out.println("windowX");
        return window;
    }).subscribe(integer -> {
        System.out.println(integer);
    });

    Thread.sleep(1_000);
}