有一个流可以收集数据作为其受体的响应。
所以假设我有n个受体,在接收到的帧数据中,我能够知道接收到的受体索引,并执行过滤器并为每个接收器创建新的源。如下所示。
------- ------ A1 B1 C1 ----- ---- ----- A2 A3 ---- ---- C2 B2 -
------- A1 A2 ----------------- ------- A3 -------------
--------------- B1 B2 ------------------------------ -
---------------------- C1 --------------- C2 -------- -
对于每个受体:
知道每个数据包都有时间戳。在这个阶段:
这里我是
:List<Integer> indexes = Arrays.asList(1,2,3,5);
for(int receptorIndex : indexes) {
observeSource(data, receptorIndex)
.map(messages -> computesDelay(store, messages.get(1), messages.get(0)))
.buffer(2000L, TimeUnit.SECONDS, 3)
.map(periods -> {
Long delta = 0L;
for(Long period : periods)
delta += period;
return delta;
})
.scan((x,y) -> {return x+y;})
.takeLast(1)
.reduce((seed, value) -> {
return seed + value;
})
.subscribe(System.out::println);
}
public static long computesDelay(Map<String, Long> list, Data one, Data another){
long expectedDelay = list.get(one.getMessage()) - list.get(another.getMessage());
long effectiveDelay = one.getTimestamp() - another.getTimestamp();
return effectiveDelay - expectedDelay;
}
public static Observable<List<Data>> observeSource(Observable<Data> data, int ReceptorIndex) {
return data
.filter(receptor -> receptor.getIndex() == ReceptorIndex)
.buffer(2,1)
.filter(list -> list.size() == 2);
}
问题是,当我在扫描后使用reduce
或takeLast(1)
时,它会呈现0元素。
我在这里缺少什么。
我希望最终输出如下(案例a):
------ ------ A1 B1 C1 ----- ---- ----- A2 A3 ---- ---- C2 B2 ------ --a4 ---------
------- A1 -----------------(A1,A2)-------(A2,A3) - - - - ----(A3,A4)----
---------------------------- 2 ------------- 1 ---- ------------ -------- 6
--------------------------- 9 -----------------