根据判断索引

时间:2016-06-16 15:43:44

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

如何为每个组创建源?并且在每对成对项目之后

2 个答案:

答案 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运算符来对每个受体的来源执行所需的操作。