Mono flatMap 和 flatMany

实例:

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

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

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

    }

    private Flux getContext(List list){
        // 模拟sink 创建出独立的flux对象,
        Flux 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  Flux flatMapMany(Function> mapper) 

入参为Function>, 返回值为 Flux.

Function> function = (x)->{
    return getContext(x);
};

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

Function> function = (x)->{
    return getMonoContext(x);
};
 @Test
    public void mapTest() {

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

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

而 flatMap方法:

public final  Mono flatMap(Function> transformer) 

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

所以通常的方法:

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

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

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

public final  Mono map(Function mapper) 

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

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

Mono 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是动态绑定的。

你可能感兴趣的:(java,spring)