当前位置: 首页 > 工具软件 > Mono > 使用案例 >

Mono flatMap 和 flatMany

羊舌光赫
2023-12-01

实例:

   一般来说,在代码中获得一个request后,需要对request进行处理,request可以使一个很复杂的对象,在getContext方法中进行构建一个Flux<Context> 上下文对象.

   本实例为了简化,request是一个List<String>

 @Test
    public void mapTest() {
        List<String> request = Arrays.asList("abc", "abcd", "klg", "klgh", "wold");
      
        Mono.just(request)
                .flatMapMany(this::getContext)
                .subscribe(System.out::println);

    }

    private Flux<Context> getContext(List<String> list){
        // 模拟sink 创建出独立的flux对象,
        Flux<Context> stringFlux = Flux.create(sink -> {
            for (String string : list) {
                sink.next(new Context(string,0));
            }
            sink.complete();
        });

        stringFlux.subscribe(System.out::println);
        return stringFlux;
    }

    @Data
    @AllArgsConstructor
    class Context{
        String data;
        int status;
    }

   , 当然你也可以用Mono.just(list)来构建。本文的例子只是为了构建工程应用中的上下文对象。

   先看flatMapMany 的入参和返回值: 

public final <R> Flux<R> flatMapMany(Function<? super T, ? extends Publisher<? extends R>> mapper)

入参为Function<T,Publisher<R>>, 返回值为 Flux<R>.

Function<List, Flux<Context>> function = (x)->{
    return getContext(x);
};

那么 R返回的类型可以使Mono也可以使Flux:

Function<List, Mono<Context>> function = (x)->{
    return getMonoContext(x);
};
 @Test
    public void mapTest() {

        Mono.just("list")
                .flatMapMany(this::getMonoContext)
                .subscribe(System.out::println);
        
    }

    private Mono<Context> getMonoContext(String string) {
        return Mono.just(new Context(string, 0));
    }

而 flatMap方法:

public final <R> Mono<R> flatMap(Function<? super T, ? extends Mono<? extends R>> transformer)

   入参为T, 返回值为 Mono<R>. flatMap的返回值是经过Mono包装过的.

所以通常的方法:

Function<String, Mono<String>> function = (x)->{ return Mono.just(a+" world"); };

Mono.just("hello").flatMap(a-> Mono.just(a+" world"))
                .subscribe(System.out::println);

而map函数并没有进行Mono的转换,

public final <R> Mono<R> map(Function<? super T, ? extends R> mapper)

String 入参 ---> 返回值一定是一个普通对象的转换

Function<String, Mono<String>> function = (x)->{ return (a+" world") };

Mono<String> monoMap = Mono.just("hello").map(a -> a + " world");
monoMap.subscribe(System.out::println);

对于普通int 的来说map 和 flatMap打印结果并没有什么不同,如下:

Mono.just(1).flatMap(a-> Mono.just(a+2))
                .subscribe(System.out::println);
Mono.just(1).map(a->a+2).subscribe(System.out::println);

异步的转换发布的元素并返回一个新的Mono,被转换的元素和新Mono是动态绑定的。

 类似资料: