Rx java RxJava';s takeLast方法的作用与JavaDoc描述的不同

Rx java RxJava';s takeLast方法的作用与JavaDoc描述的不同,rx-java,Rx Java,我在下面试过了 public static void main(String[] args) throws Exception { Observable.interval(500L, TimeUnit.MILLISECONDS) .take(7) .takeLast(2, 2100L, TimeUnit.MILLISECONDS) .subscribe(System.out::println); Thread.sleep(5000L); } 我希望我

我在下面试过了

public static void main(String[] args) throws Exception {
  Observable.interval(500L, TimeUnit.MILLISECONDS)
      .take(7)
      .takeLast(2, 2100L, TimeUnit.MILLISECONDS)
      .subscribe(System.out::println);
  Thread.sleep(5000L);
}
我希望我能得到
2
3

time: 0...500...1000...1500...2000...2500...3000
emit: 0...1.....2......3......4......5......6
takeLast:.......X......X.....................
param's time...[...........2100ms..............]
但结果是
5
6

对我来说,这并不是大理石图中描述的JavaDoc

这(
5
6
)对吗? 如果是,此方法与
takeLast(int count)
之间的区别是什么?
时间参数有什么意义吗?

再次检查大理石图。它似乎完全按照所描述的那样工作

time: 0...500...1000...1500...2000...2500...3000
emit: 0...1.....2......3......4......5......6
takeLast:............................X......X
param's time......................[..2100ms.]

再次检查大理石图。它似乎完全按照所描述的那样工作

time: 0...500...1000...1500...2000...2500...3000
emit: 0...1.....2......3......4......5......6
takeLast:............................X......X
param's time......................[..2100ms.]

首先,我想你的假设应该是
3
4
,而不是
2
3
,因为
t=2000ms时也有一个值

您需要仔细阅读此处(我第一次使用时也弄错了):“返回:一个
可观察的
,它最多从源
可观察的
中发出
个项目,这些项目在
可观察的
完成之前的指定时间窗口内发出。”

因此,由于
take(7)
,您的
Observable
在发出7个元素后完成。然后你要求(用斜体句替换)“一个
可观察的
,它最多从
可观察的
源中发出两个项目,这些项目是在
可观察的
完成之前的最后2100毫秒内发出的”。您所假设的是FIRST2100ms中的值,而
takeLast
运算符的过载情况并非如此

如果您想要实现ASCII图表所绘制的功能,我想您需要使用and,而不是
take(7).last(2210L,TimeUnit.ms)


最后,关于
take(7)
take(22100l,TimeUnit.ms)
之间是否存在差异的问题:是的,前者保证为您提供最后7项(假设流程中有7项或更多项),而后者最多为您提供,只有在调用
onCompleted
之前的最后2100ms内有

首先,我想你的假设应该是
3
4
,而不是
2
3
,因为
t=2000ms
也有一个值

您需要仔细阅读此处(我第一次使用时也弄错了):“返回:一个
可观察的
,它最多从源
可观察的
中发出
个项目,这些项目在
可观察的
完成之前的指定时间窗口内发出。”

因此,由于
take(7)
,您的
Observable
在发出7个元素后完成。然后你要求(用斜体句替换)“一个
可观察的
,它最多从
可观察的
源中发出两个项目,这些项目是在
可观察的
完成之前的最后2100毫秒内发出的”。您所假设的是FIRST2100ms中的值,而
takeLast
运算符的过载情况并非如此

如果您想要实现ASCII图表所绘制的功能,我想您需要使用and,而不是
take(7).last(2210L,TimeUnit.ms)


最后,关于
take(7)
take(22100l,TimeUnit.ms)
之间是否存在差异的问题:是的,前者保证为您提供最后7项(假设流程中有7项或更多项),而后者最多为您提供,只有在调用
onCompleted
之前的最后2100ms内有

谢谢你的帮助!现在我得到了takeLast(2)
和takeLast(22100l,TimeUnit.ms)之间的差异
。如果时间过短,例如
takeLast(2100l,TimeUnit.ms)
,可观察到的将发射少于2个项目。但我仍然混淆了JavaDoc的大理石图。如果takeLast方法获得最后1项,则在JavaDoc的大理石图中,可观察对象必须发出紫色项而不是蓝色项。大理石图看起来像
takeLast(1210L,TimeUnit.millises)
takeLast(2100L,TimeUnit.millises)相同。take(1)
。现在我明白了您关于JavaDoc大理石图的意思。您的第二条评论是正确的,或者您发现了一个bug。。。事实上,大理石图实际上显示:“一个
可观察的
,它最多从源
可观察的
发出第一个
计数
项目,这些项目在
可观察的
完成之前的一个指定时间窗口内发出。”。也许您可以稍微研究一下,看看这是否是API中的行为。如果没有,我想您可以在RxJava存储库中创建一个问题。谢谢谢谢你的帮助!现在我得到了takeLast(2)
和takeLast(22100l,TimeUnit.ms)之间的差异
。如果时间过短,例如
takeLast(2100l,TimeUnit.ms)
,可观察到的将发射少于2个项目。但我仍然混淆了JavaDoc的大理石图。如果takeLast方法获得最后1项,则在JavaDoc的大理石图中,可观察对象必须发出紫色项而不是蓝色项。大理石图看起来像
takeLast(1210L,TimeUnit.millises)
takeLast(2100L,TimeUnit.millises)相同。take(1)
。现在我明白了您关于JavaDoc大理石图的意思。您的第二条评论是正确的,或者您发现了一个bug。。。事实上,大理石图