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。。。事实上,大理石图