美文网首页
reactor Mono Flux 之间的一些转换场景

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

作者: Yellowtail | 来源:发表于2020-06-24 21:44 被阅读0次

    背景

    最近在使用 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();
    

    相关文章

      网友评论

          本文标题:reactor Mono Flux 之间的一些转换场景

          本文链接:https://www.haomeiwen.com/subject/thvdfktx.html