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

时间:2016-10-28 18:33:02

标签: rx-java rxjs reactivex

我是ReactiveX的相对新手,并且分别从序列的开头和结尾了解Rx.Observable.takeRx.Observable.takeLast,并Rx.Observable.windowWithCount从原始片段中获取可能重叠的窗口观察到的。为了好玩,我想完全使用反应式算子和传感器编写FFT算法。一些算法对于端口来说是直观的,但有些算法很难用流建模。具体来说,rfft作用于序列的开始和结束值,我无法弄清楚该怎么做。更具体地说,如果我有:

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

它将被分解为可观察的窗口:

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

对于任意可观察的序列,是否有一种优雅的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

我不得不说,我不认为使用有限流的反应是一个好主意,因为你没有任何反应或任何反压的事件。你必须知道流的长度和有限的。最好的解决方案是使用带有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);
}