reactor Mono Flux 之间的一些转换场景

2020-06-24  本文已影响0人  Yellowtail

背景

最近在使用 MonoFlux 的过程中,遇到了相互转换的一些问题,记录下来

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();
上一篇 下一篇

猜你喜欢

热点阅读