微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WebFlux 的深度“flatReduce”?

如何解决WebFlux 的深度“flatReduce”?

我已经定义了一个运算符 flatReduce(),它对 reduce() 的作用就像 flatMap()map() 的作用一样:

public class FlatReduce {
    public static <V,W> Mono<V> flatReduce(Mono<V> initial,Iterable<W> items,BiFunction<V,W,Mono<V>> accumulator) {
        for (W item : items) {
            initial = initial.flatMap(v -> accumulator.apply(v,item));
        }
        return initial;
    }

    public static void main(String[] args) {
        flatReduce(Mono.just(1),IntStream.range(0,4000).mapToObj(it -> it).collect(toList()),(a,b) -> Mono.just(a + b)).block();
    }
}

这会产生深度嵌套的 flatMaps 并且我观察到堆栈溢出。有什么办法可以解决这个问题(也许可以把它变成延续风格)?

谢谢。

解决方法

通过将 Mono 转换为 CompletableFuture 找到了解决方法。

    @Test
    public void runTest() {
        System.out.println(flatReduce(Mono.just(1),IntStream.range(1,500000).mapToObj(it -> it).collect(toList()),(a,b) -> Mono.just(a + 1)).block());
    }

    private static <V,W> Mono<V> flatReduce(Mono<V> initial,List<W> items,BiFunction<V,W,Mono<V>> accumulator) {
        return Mono.fromCompletionStage(flatReduceWithFuture(initial.toFuture(),items,(v,w) -> accumulator.apply(v,w).toFuture()));
    }

    private static <V,W> CompletableFuture<V> flatReduceWithFuture(CompletableFuture<V> initial,CompletableFuture<V>> accumulator) {
        for (W item : items) {
            initial = initial.thenCompose(x -> accumulator.apply(x,item));
        }
        return initial;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。