我在下面试过
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)
有什么区别?
时间参数是否意味着什么?
答案 0 :(得分:2)
首先,我猜你的假设是3
和4
而不是2
和3
,因为{{1}处还有一个值}?
你需要在这里仔细阅读(我自己第一次使用它时出错了):" 返回:t=2000ms
最多发出Observable
个项目源自count
的在Observable
完成 之前的指定时间窗口内发出的
因此,由于Observable
,您的Observable
在发出7个元素后完成。然后你要求(替换为斜体句)" take(7)
最多发出 2项来自<{1}}中发出的<在Observable
完成&#34;之前,在最后2100毫秒中强>你假设的是 FIRST 2100ms中的值,而Observable
运算符的这种重载不是这种情况。
如果您想要的东西能够完成ASCII图表的绘制,我猜您需要使用take(2100L, TimeUnit.MILLISECONDS)
和take(2)
代替Observable
。
最后,您的问题是takeLast
和take(7).last(2, 2100L, TimeUnit.MILLISECONDS)
之间是否存在差异:是的,前者保证会为您提供最后7项(假设流中有7个或更多项目)当然),而后者只给你最多 2项,只有在调用take(7)
之前的最后2100ms内有任何项目。
答案 1 :(得分:1)
再次检查大理石图。它似乎正如所描述的那样工作,即
time: 0...500...1000...1500...2000...2500...3000
emit: 0...1.....2......3......4......5......6
takeLast:............................X......X
param's time......................[..2100ms.]