Rx java Rx跳过,直到超过秒数 我有一个发布主题,它总是每X秒发出一个信号,我只想考虑Y秒后发出的第一个项目。

Rx java Rx跳过,直到超过秒数 我有一个发布主题,它总是每X秒发出一个信号,我只想考虑Y秒后发出的第一个项目。,rx-java,rx-java2,rx-android,Rx Java,Rx Java2,Rx Android,范例 可观测A每秒发出一个“滴答声” 可观测B应仅每5秒发出此“滴答声”,忽略 介于两者之间的那些 也就是说,跳过每个项目,直到某个时间跨度过去 这不是去盎司,因为去盎司需要原始可观测值保持5秒而不发射,但我的每秒钟发射一次。请查看我的解决方案。”tickEverySecond'将每秒发出一个值“结果”将在5秒的时间窗口内收集“TickerySecond”发出的所有项目。每隔5秒窗口,“TickerVerySecond”最后发出的值将推送到订户 @Test public void nam

范例

  • 可观测A每秒发出一个“滴答声”
  • 可观测B应仅每5秒发出此“滴答声”,忽略 介于两者之间的那些
也就是说,跳过每个项目,直到某个时间跨度过去


这不是去盎司,因为去盎司需要原始可观测值保持5秒而不发射,但我的每秒钟发射一次。

请查看我的解决方案。”tickEverySecond'将每秒发出一个值“结果”将在5秒的时间窗口内收集“TickerySecond”发出的所有项目。每隔5秒窗口,“TickerVerySecond”最后发出的值将推送到订户

@Test
  public void name() {
    TestScheduler testScheduler = new TestScheduler();
    Flowable<Long> tickEverySecond = Flowable.interval(0, 1, TimeUnit.SECONDS, testScheduler);

    Flowable<Long> result = tickEverySecond.window(5, TimeUnit.SECONDS, testScheduler).flatMap(longFlowable -> longFlowable.takeLast(1));

    TestSubscriber<Long> test = result.test();

    testScheduler.advanceTimeTo(4, TimeUnit.SECONDS);
    test.assertValueCount(0).assertNotComplete();

    testScheduler.advanceTimeTo(5, TimeUnit.SECONDS);
    test.assertValue(4L).assertNotComplete();

    testScheduler.advanceTimeTo(9, TimeUnit.SECONDS);
    test.assertValues(4L).assertNotComplete();

    testScheduler.advanceTimeTo(10, TimeUnit.SECONDS);
    test.assertValues(4L, 9L).assertNotComplete();

    testScheduler.advanceTimeTo(14_999, TimeUnit.MILLISECONDS);
    test.assertValues(4L, 9L).assertNotComplete();
  }
@测试
公共无效名称(){
TestScheduler TestScheduler=新的TestScheduler();
Flowable TickerySecond=Flowable.interval(0,1,TimeUnit.SECONDS,testScheduler);
Flowable result=tickEverySecond.window(5,TimeUnit.SECONDS,testScheduler).flatMap(longFlowable->longFlowable.takeLast(1));
TestSubscriber test=result.test();
testScheduler.advanceTimeTo(4,时间单位:秒);
test.assertValueCount(0).assertNotComplete();
testScheduler.advanceTimeTo(5,时间单位:秒);
test.assertValue(4L).assertNotComplete();
testScheduler.advanceTimeTo(9,时间单位:秒);
test.assertValues(4L).assertNotComplete();
testScheduler.advanceTimeTo(10,时间单位:秒);
test.assertValues(4L,9L).assertNotComplete();
testScheduler.advanceTimeTo(14_999,时间单位为毫秒);
test.assertValues(4L,9L).assertNotComplete();
}
您可以使用以下运算符获得相同的效果:

Flowable<Long> result = tickEverySecond.throttleLast(5, TimeUnit.SECONDS, testScheduler);
Flowable result=tickEverySecond.throttleLast(5,TimeUnit.SECONDS,testScheduler);
我认为.window()操作符就是您所需要的-

它按时间段划分事件,请参见RxJava文档-

你能画一个大理石图吗?