用于存储先前映射结果的语法

问题描述 投票:1回答:2

我想知道在弹簧网络流量中使用先前映射结果的好方法

Mono.just(request)
...
.flatMap(object0 -> createObject1(object0))
.flatMap(object1 -> createObject2(object1))
...

在这一点上获取object0的好方法是什么,所以我们可以添加类似的东西

.flatmap(object0 -> createResult(object0))

我通过将这两种方法联合起来解决了这个问题,因此我们在全局变量中有了object0,但它看起来不太好。

另一个例子

Mono.just(request)
...
.flatMap(object0 -> createResponse(object))
.map(result -> mapToObject1(result))
.flatMap(object1-> saveObject1(object1))

如何在此时返回“结果”?

你能不能给出相同案例的好例子的链接,因为将这一行联合起来使结果全局的解决方案看起来并不好,因为它会产生模糊的方法?

project-reactor
2个回答
2
投票

您可以将几个对象包装到reactor.util.function.Tuples中,如下所示:

Mono.just(request)
...
.flatMap(object0 -> Tuples.of(object0, createObject1(object0)))
.flatMap(tuple -> createObject2(tuple.getT2()))
...

我不知道这是否真的是最好的做法,因为你的代码片段非常通用,我不知道它是否是底层API的问题。


1
投票

对于第一种情况,因为你使用flatMap用于createObject1(object0),我认为它正在返回Mono<Object1>,我认为以下代码片段可以做你想要的。

    public Mono<Class1> createObject1(Class0 object0) {
        //...
    }

    public Mono<Class2> createObject2(Class1 object1, Class0 object0) {
        //...
    }

    public void test() {
        Mono.just(new Class0())
        .flatMap(object0 -> createObject1(object0).zipWith(Mono.just(object0)))
        .flatMap(tuple -> createObject2(tuple.getT1(), tuple.getT2()));
    }

对于第二种情况,正如接受的答案所建议的那样,在reactor.util.function.Tuples中使用map就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.