【问题标题】:Reduce List<T> using BiFunction<T, T, Mono<T>>使用 BiFunction<T, T, Mono<T>> 减少 List<T>
【发布时间】:2018-09-06 09:04:48
【问题描述】:

我有List&lt;T&gt;,我需要使用BiFunction&lt;R, T, Mono&lt;R&gt;&gt; 聚合器来减少它。

所以我需要链接那些单声道 (Mono&lt;R&gt;) 使用项目反应器如何做到这一点?

更新: 例如,我有一个包含 item1、item2 等的列表... 我有一个函数Mono&lt;R&gt; reduce(T item, R acc)

我需要这样的东西:reduce(item1, startAcc).flatMap(acc -&gt; reduce(item2, acc)).flatMap(acc -&gt; reduce(item3, acc))

我可以使用递归来实现,但如果列表足够长,我会得到 StackOverflowError

【问题讨论】:

  • 您能否分享输入和所需的输出,以便我可以建议代码。
  • @VikramRawat 我有列表
  • @VikramRawat 我有List&lt;T&gt;,还有一个函数Mono&lt;R&gt; reduce(T item, R acc) 我需要Mono 所以,基本上,它是这样的:reduce(item1, startAcc).flatMap(acc -&gt; reduce(item2, acc)).flatMap(acc -&gt; reduce(item3, acc))....
  • 我可以使用递归来实现这个,但是当它是一个长列表时会抛出 StackOverflowError
  • 这是一个已知的错误 - github.com/reactor/reactor-core/issues/1441

标签: java mono reactive-programming project-reactor


【解决方案1】:

您应该简单地使用 Flux 上的 reduce 方法。示例代码如下:

public void reduceTest() {

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    Flux<Integer> numberFlux = Flux.fromIterable(numbers);

    Double initial = 2.5;
    BiFunction<Double, Integer, Double> multiply = (doubleNumber, numberInt) -> doubleNumber * numberInt;

    Mono<Double> floatResult = numberFlux.reduce(initial, multiply);        
    floatResult.subscribe(System.out::println);

}

请参阅https://projectreactor.io/docs/core/release/api/index.html?reactor/core/publisher/Mono.html 的 Java 文档

【讨论】:

  • 谢谢,但我需要这个 BiFunction&lt;R, T, Mono&lt;R&gt;&gt; 你的变体有 BiFunction
  • 但是在第一次reduce之后,你又做了一个flatMap,所以基本上你总是将Mono的值用于下一个reduce方法。那么,为什么不做所有的减少并最终拥有一个 Mono 呢?
  • 我不明白你的建议。我可以这样想:` List numbers = IntStream.range(1, 10).boxed().collect(toList()); Flux numberFlux = Flux.fromIterable(numbers); BiFunction, Integer, Mono> multiply = (doubleNumber, numberInt) -> doubleNumber.flatMap(acc -> Mono.just(acc * numberInt)); Mono floatResult = numberFlux.reduce(Mono.just(2.5), multiply).flatMap(mono -> mono); floatResult.subscribe(System.out::println); ` 但是,如果你指定 10000 作为上限值,你会得到 StackOverflow
猜你喜欢
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多