Java 根据描述索引创建多个源
我有一个从它的受体那里收集数据的流 所以假设我有n个受体,在接收到的帧数据中,我能够知道它是从哪个受体索引接收的,并执行一个过滤器,为每个受体创建一个新的源,如下所示 -------a1---b1---c1---a2---a3---c2---b2- -------a1---------a2------a3------------- ---------------b1-------------------b2- ----------------------c1-------c2--------- 下一步包括从每个最新的值对中提取 以下是我的代码示例:Java 根据描述索引创建多个源,java,rx-java,Java,Rx Java,我有一个从它的受体那里收集数据的流 所以假设我有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());
}
}
如何为每个组创建源?如果您已经打印了给定输入集示例的预期输出,那么在逐个对地获取每个组的项目之后,将非常好,因为您对最新对的含义的解释是开放的。 因此,如果我假设最新的{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();
}
上面的代码只是一个原型,展示了一种通用的方法。您可以对特定的POJO应用类似的逻辑。
如果你有别的意思,请告诉我。这里是实现的方法。假设您有一个发射器和多个接收器:
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
操作符,无法对每个接收器的源执行所需的操作。这种方法工作得很好,但我想利用groupBy,不必在列表或字符串中跟踪我的索引。是否有可能从GroupeObservableGroupObservable中获得多个源?GroupObservable只是一个助手,它通过“连接”到原始根源,每次调用它时都会创建一个新源。所以你可以把它们放进列表,数组,随便什么。不确定使用groupby有什么问题。你能详细说明一下吗?问题是如果我使用groupBy,我怎么能将它分解成多个不同的观测值。如果您可以使用groupBy显示具有相同结果的不同方法,将会很有帮助
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();
});
}