我有一个流可以收集数据作为其受体的响应。
所以假设我有n个受体,在接收到的帧数据中,我能够知道接收到的受体索引,并执行过滤器并为每个接收器创建新的源。如下所示。
------- ------ A1 B1 C1 ----- ---- ----- A2 A3 ---- ---- C2 B2 -
------- A1 A2 ----------------- ------- A3 -------------
--------------- B1 B2 ------------------------------ -
---------------------- C1 --------------- C2 -------- -
下一步是从每一对最重要的值中取出
这是我的代码示例:
data.publish().refCount()
.groupBy(frame -> frame.getIndex())
.flatMap(Observable::toList)
.buffer(2,1)
.subscribe( delays -> {
System.out.println(delays);
});
框架是POJO:
public class Frame {
private int index;
private String message;
private long timestamp;
public Frame(int index, String message) {
this.index = index;
this.message = message;
setTimestamp(System.currentTimeMillis());
}
}
如何为每个组创建源?并且在每对成对项目之后
答案 0 :(得分:2)
如果您为给定的输入集示例打印了预期输出,那将会很好,因为您对最新对的含义的解释是可以解释的。 因此,如果我假设最新的{a1,a2,a3}对:(a1,a2)和(a2,a3),则以下代码将执行您想要的操作:
private static Observable<List<String>> observeGrouped(Observable<String> str, String group) {
return str.filter(s->s.substring(0, 1).equals(group)).buffer(2,1).filter(list->list.size() == 2);
}
@Test
public void test() throws InterruptedException {
Observable<String> src = Observable.just("a1", "b1", "c1", "a2", "a3", "c2", "b2").publish().refCount();
String[] groups = new String[] {"a", "b", "c"};
CountDownLatch latch = new CountDownLatch(groups.length);
for (String group : groups) {
observeGrouped(src, group).subscribe(System.out::println, e->{}, ()->latch.countDown());
}
latch.await();
}
输出:
[a1, a2]
[a2, a3]
[b1, b2]
[c1, c2]
上面的代码只是展示一般方法的原型。您可以将类似的逻辑应用于特定的POJO。 如果您有其他意思,请告诉我。
答案 1 :(得分:0)
这是实施的方法。假设你有一个发射器和多个受体:
stream.groupBy(group -> group.geName())
.map(receptor -> observeSource(receptor))
.forEach(source -> {
source
.buffer(2, 1)
.filter(items -> items.size() == 2)
.map(pairs -> computeDelay(pairs.get(0), pairs.get(1)))
.doOnNext(delay -> checkDelay(delay))
.subscribe();
});
}
我错过了forEach
运算符来对每个受体的来源执行所需的操作。