当前位置: 首页 > 知识库问答 >
问题:

任意数量的Observable::flatMap调用链

邢嘉祯
2023-03-14

比如说,我有几个可观察的供应商对get通话有副作用:

Subject<String> firstSubject = PublishSubject.create();
Supplier<Observable<String>> firstSupplier = () -> {
    System.out.println("side effect of first one");
    return firstSubject;
};

Subject<String> secondSubject = PublishSubject.create();
Supplier<Observable<String>> secondSupplier = () -> {
    System.out.println("side effect of second one");
    return secondSubject;
};

Subject<String> thirdSubject = PublishSubject.create();
Supplier<Observable<String>> thirdSupplier = () -> {
    System.out.println("side effect of third one");
    return thirdSubject;
};

现在我想用以下方式将它们结合起来——在前一个供应商的可观察的发出一个值后,调用下一个供应商的getonNext)。我可以通过以下代码来实现:

firstSupplier.get()
        .flatMap(__ -> secondSupplier.get())
        .flatMap(__ -> thirdSupplier.get())
        .subscribe();
// output: side effect of first one
firstSubject.onNext("");
// output: side effect of second one
secondSubject.onNext("");
// output: side effect of third one

我如何重写这段代码来接受未知数量的供应商,作为-例如-集合传递

我已经回顾了可观察的的各种工厂方法(比如合并concat),但是他们都在收集可观察的资源,这意味着我必须给我所有的供应商打电话获取。然而,在我的例子中,重要的是要懒洋洋地调用它——只有在前面的Observable发出一个值之后。


共有1个答案

何安宜
2023-03-14

编辑2:

我完全忘记了Observable.flatMap调用映射器,即使maxConcurrency设置为1并将生成的可观察排队等待以后运行。

我希望下面的设置能像预期的那样工作(即,它没有指定对象的后续onNext应该发生什么)。

Subject<String> firstSubject = PublishSubject.create();
Supplier<Observable<String>> firstSupplier = () -> {
    System.out.println("side effect of first one");
    return firstSubject;
};

Subject<String> secondSubject = PublishSubject.create();
Supplier<Observable<String>> secondSupplier = () -> {
    System.out.println("side effect of second one");
    return secondSubject;
};

Subject<String> thirdSubject = PublishSubject.create();
Supplier<Observable<String>> thirdSupplier = () -> {
    System.out.println("side effect of third one");
    return thirdSubject;
};

Collection<Supplier<Observable<String>>> collection =
    Arrays.asList(firstSupplier, secondSupplier, thirdSupplier);

Observable.fromIterable(collection)
.concatMap(supplier -> supplier.get().take(1))
.subscribe();

System.out.println("// output: side effect of first one");
firstSubject.onNext("");
System.out.println("// output: side effect of second one");
secondSubject.onNext("");
System.out.println("// output: side effect of third one");

版画:

side effect of first one
// output: side effect of first one
side effect of second one
// output: side effect of second one
side effect of third one
// output: side effect of third one
 类似资料:
  • 我们在vertx中使用Futures,例如: 例如,我们处理2个呼叫。 或者我有另一个代码段,可以处理任意数量的方法: 这里,我们将链接会话中的所有请求。getRequestList(),而不事先知道它们的计数。 但是<代码>的缺点。all()方法是,我们无法控制订单。 如何使用Vertx Futures链接任意数量的方法(不知道调用的确切数量)? 编辑: 官方指南谈到了顺序组合,但给出的示例有3

  • 我想创建一个方法,它可以具有任意数量的参数和任何数据类型的任何方法。 为。我想动态调用以下所有方法void method1(int x,int y)void method2(int x,String y)void method3(Float x,Long y,String z) 我正在使用反射来这样做。现在我讨论了如何在调用这个动态方法的过程中向这些方法传递参数。我做了多远... 如何调用MyMe

  • 问题内容: 我正在编写一个函数,可以求解任意数量的联立方程。方程的数量由函数的参数之一设置,每个方程由多个符号构成- 与方程数量一样多。这意味着我不能简单地对方程式甚至是将方程式组合在一起所需的符号进行硬编码。该函数需要能够处理任意数量的方程式。因此,我的问题是,如何生成符号列表? 我有一个可能的解决方案,但是我的直觉告诉我这不会很有效。如果有更好的方法,请告诉我。 我是SymPy的新手,现在仍然

  • 问题内容: 对于一个简单的问题,我似乎找不到所需的答案:如何将任何数字四舍五入到最接近的数字? 例如,无论何时数字为0.2、0.7、0.2222、0.4324、0.99999,我都希望结果为1。 到目前为止,我有 不过,它似乎并没有完成任务。 问题答案: 是正确的调用函数。我猜是一个,将执行整数运算。试试吧。 输出: 看到http://ideone.com/yhT0l

  • 问题 你想构造一个可接受任意数量参数的函数。 解决方案 为了能让一个函数接受任意数量的位置参数,可以使用一个*参数。例如: def avg(first, *rest): return (first + sum(rest)) / (1 + len(rest)) # Sample use avg(1, 2) # 1.5 avg(1, 2, 3, 4) # 2.5 在这个例子中,rest是由所

  • 我正在努力想出一种算法,它允许我绘制一个像数据结构一样的树,其中每个节点可以有0..n个子节点。对我来说,问题是,我不知道我必须放置节点多远,以便子节点不会重叠。 在本例中,“d”是“b”的子级,“g”是“e”的子,当我在给定树的总宽度的情况下,将子级均匀分布在其父级上方时,它们在x轴上重叠。 节点不以任何方式排序。所以它实际上更像一个必须看起来像树的图。