RxJava的takeLast方法并不像JavaDoc所描述的那样

时间:2016-05-19 01:42:13

标签: 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);
}

我希望得到23

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

但结果为56

对我来说,不是大理图中描述的JavaDoc。

http://reactivex.io/RxJava/javadoc/rx/Observable.html#takeLast%28int,%20long,%20java.util.concurrent.TimeUnit%29

这是(56)对吗? 如果是这样,这个方法与takeLast(int count)有什么区别? 时间参数是否意味着什么?

2 个答案:

答案 0 :(得分:2)

首先,我猜你的假设是34而不是23,因为{{1}处还有一个值}?

你需要在这里仔细阅读(我自己第一次使用它时出错了):" 返回:t=2000ms最多发出Observable个项目源自countObservable完成 之前的指定时间窗口内发出的

因此,由于Observable,您的Observable在发出7个元素后完成。然后你要求(替换为斜体句)&#34; take(7)最多发出 2项来自<{1}}中发出的<在Observable完成&#34;之前,在最后2100毫秒中强>你假设的是 FIRST 2100ms中的值,而Observable运算符的这种重载不是这种情况。

如果您想要的东西能够完成ASCII图表的绘制,我猜您需要使用take(2100L, TimeUnit.MILLISECONDS)take(2)代替Observable

最后,您的问题是takeLasttake(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.]