拉链反应流与自身

时间:2017-08-14 17:41:19

标签: java reactive-programming

我正在使用Java Reactor Core,并且我有一个被动Flux个对象。对于Flux的每个对象,我需要做一个外部查询,它将为每个输入返回一个不同的对象。新生成的Flux需要用原始的压缩 - 所以2 Flux的项目必须同步并以相同的顺序生成。

我只是重复使用相同的流程两次,如下所示:

 Flux<MyObj> aTest = Flux.fromIterable(aListOfObj);

Flux<String> myObjLists = aTest.map(o -> MyRepository.findById(o.name)).map(o -> {
  if (!o.isPresent()) {
    System.out.println("Fallback to empty-object");
    return "";
  }
  List<String> l = o.get();
  if (l.size() > 1) {
    System.out.println("that's bad");
  }
  return l.get(0);
});

Flux.zip(aTest, myObjLists, (a, b) -> doSomethingWith(a,b))

这是正确的方法吗?如果myObjLists发出错误,如何阻止zip阶段跳过失败的迭代?

1 个答案:

答案 0 :(得分:0)

我终于选择使用TupleOptional s(以防止会破坏通量的空项),因此我不需要重新使用使用最初的Flux

Flux<Tuple<MyObj, Optional<String>>> myObjLists = Flux.fromIterable(aListOfObj)
  .map(o -> Tuples.of(o, Optional.ofNullable(MyRepository.findById(o.name))
  .flatMap(t -> {
    if (!t.getT2().isPresent()) {
      System.out.println("Discarding this item");
      return Flux.empty();
    }
    List<String> l = t.getT2().get();
    if (l.size() > 1) {
      System.out.println("that's bad");
    }
    return Tuples.of(t.getT1(), l.get(0));
  })
  .map(t -> doSomethingWith(t.getT1(),t.getT2()))

请注意,flatMap可以替换为.map().filter(),删除缺少可选项的元组