Java 根据描述索引创建多个源

Java 根据描述索引创建多个源,java,rx-java,Java,Rx Java,我有一个从它的受体那里收集数据的流 所以假设我有n个受体,在接收到的帧数据中,我能够知道它是从哪个受体索引接收的,并执行一个过滤器,为每个受体创建一个新的源,如下所示 -------a1---b1---c1---a2---a3---c2---b2- -------a1---------a2------a3------------- ---------------b1-------------------b2- ----------------------c1-------c2---------

我有一个从它的受体那里收集数据的流

所以假设我有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();
    });
}