将Flowable和Single与groupBy相结合

时间:2018-04-02 15:49:12

标签: java reactive-programming rx-java2

我有两个不同的文件,有关系:

class Foo {
    String getBarId();
    String message();
}
class Bar {
    String id();
    String description();
}

鉴于Flowable Foo,我必须将其与Single的{​​{1}}合并,并附加字符串消息。这是非反应性代码:

Bar

如何将其移至被动?

所以我有以下功能:

  • public void sendMessageToBar() { getFoo() .collect(groupingBy(Foo::getBarId)) .entrySet() .stream() .collect(toMap( entry -> getBar(entry.getKey)), entry -> entry.getValue().stream().collect(joining("")))) .entrySet() .forEach((b,s) -> sendMessage(b,s)); } public void sendMessage(Bar bar, String message) {}

  • Flowable<Foo> getFoo();

  • Single<Bar> getBar(String barId);

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

分组过程几乎完全相同。要注意的是,分组的observable有一个方法getKey(),可以告诉您需要使用哪个Bar ID。然后使用Foo运算符收集引用该Bar的{​​{1}}项,将其转换为字符串并将其传递给toList()sendMessage()类只是配对值,可以在几分钟内手动滚动。

Pair<?,?>

答案 1 :(得分:0)

只需将flatMap条形图放到sendMessage s:

上的条形和条形图上
Flowable<Foo> foos = ...

foos.flatMapCompletable(foo ->
   getBar(foo.getBarId())
   .flatMapCompletable(bar -> 
        sendMessage(bar, foo.message())
   )
, 1) // <-- how many concurrent getBars and thus sendMessages to allow
.subscribe(
    bars -> { /** can be ignored ?! */ }, 
    error -> { /* handle errors */ }
)

答案 2 :(得分:0)

好的,我解决了:

return getFoo()
  .groupBy(Foo::getBarId)
  .flatMapSingle(group - > {
    final Single < String > message = group.toList().map(f - > f.stream()
      .map(Foo::getMessage).collect(joining("")));
    return getBar(group.getKey()).zipWith(message, Maps::
      immutableEntry);
  })
  .flatMapCompletable(s - > sendMessage(s.getKey(), s.getValue()));