存储先前映射结果的语法
Syntax to store results of previous mapping
我想知道在 spring web-flux 中使用先前映射结果的好方法,例如
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))
此时如何return"result"?
你能给link相同案例的好例子吗,因为联合这条线使结果全局化的解决方案看起来不太好,因为它会产生模棱两可的方法?
您可以将多个对象包装到一个 reactor.util.function.Tuples
中,如下所示:
Mono.just(request)
...
.flatMap(object0 -> Tuples.of(object0, createObject1(object0)))
.flatMap(tuple -> createObject2(tuple.getT2()))
...
我不知道这是否真的是最佳实践,因为您的代码片段非常通用,我不能说这是否是底层的问题 API。
对于第一种情况,因为您将 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()));
}
对于第二种情况,正如接受的答案所建议的那样,在 map
中使用 reactor.util.function.Tuples
就可以了。
我的版本看起来像那样
.flatMap(upperResult -> {
return Mono.just(upperResult).zipWith(monoGeneratingFunction(upperResult));
})
.flatMap(tuple -> {
var upperResult = tuple.getT1();
var lowerResult = tuple.getT2();
})
您可以在单声道上直接使用 zipWhen
。 zipWhen
是组合结果的特定运算符。
Mono.just(request)
...
.zipWhen(object0 -> createObject1(object0))
...
我想知道在 spring web-flux 中使用先前映射结果的好方法,例如
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))
此时如何return"result"?
你能给link相同案例的好例子吗,因为联合这条线使结果全局化的解决方案看起来不太好,因为它会产生模棱两可的方法?
您可以将多个对象包装到一个 reactor.util.function.Tuples
中,如下所示:
Mono.just(request)
...
.flatMap(object0 -> Tuples.of(object0, createObject1(object0)))
.flatMap(tuple -> createObject2(tuple.getT2()))
...
我不知道这是否真的是最佳实践,因为您的代码片段非常通用,我不能说这是否是底层的问题 API。
对于第一种情况,因为您将 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()));
}
对于第二种情况,正如接受的答案所建议的那样,在 map
中使用 reactor.util.function.Tuples
就可以了。
我的版本看起来像那样
.flatMap(upperResult -> {
return Mono.just(upperResult).zipWith(monoGeneratingFunction(upperResult));
})
.flatMap(tuple -> {
var upperResult = tuple.getT1();
var lowerResult = tuple.getT2();
})
您可以在单声道上直接使用 zipWhen
。 zipWhen
是组合结果的特定运算符。
Mono.just(request)
...
.zipWhen(object0 -> createObject1(object0))
...