背景
最近在使用 Mono
和 Flux
的过程中,遇到了相互转换的一些问题,记录下来
Mono + Mono => Mono
假设有三个类
class A {
}
class B {
}
class C {
private A a;
private B b;
}
现在有 Mono<A> mA
Mono<B> mB
怎么转成 Mono<C> mC
呢?
// 通过两个mono, 构造一个新的 mono
// https://www.reactiveprogramming.be/project-reactor-combining-monos/
Mono<A> mA;
Mono<B> mB;
Mono<C> bodyMono = mA.zipWith(mB, (t1, t2) -> {
return genC(t1, t2);
});
private C genC(A a, B b) {
C c = new C();
c.setA(a);
c.setB(b);
return c;
}
List<Mono<A>> => Flux<A>
就是有一个 Mono<A>
的列表,怎么转成一个 Flux<A>
呢?
List<A> list;
Flux<A> flux = Flux.fromIterable(list)
.flatMap(k -> genA(k))
.collectList();
private Mono<A> genA(A s) {
return Mono.just(s);
}
注意,这个代码意会即可,实际过程中, genA
就是你生成 Mono
的方法,可能没有这么简单
Flux<String> => Mono<List<String>>
第一种:如果 flux
是空的, single
会返回一个 Mono.error
, 消费的时候就会抛异常
Flux<String> flux;
Mono<List<String>> mono = flux.buffer().single()
第二种:collectList
是把数据存在内存里,注意数据量对内存的影响
Flux<String> flux;
Mono<List<String>> mono = flux.collectList();
网友评论