Flux中的map、flatMap、concatMap的区别

发布时间 2023-07-28 13:49:55作者: fogey

flatMapmapconcatMap都是在Flux中用于进行数据转换和处理的方法,但它们在处理元素和顺序上有一些区别:


  1. map方法:

    • map方法用于对Flux中的每个元素进行一对一的转换。
    • 对于每个元素,map方法都会应用一个转换函数,并将转换后的结果作为新的元素放入新的Flux中。
    • 转换函数的返回值类型可以与原始元素的类型不同。
    • map方法不会改变元素的顺序,并且是并行执行的,即它不会等待前一个元素的转换完成再处理下一个元素。
     @Test
     public void test() {
         Flux.just("a", "b", "c")
                 .map(s -> {
                     String str = s + s;
                     System.out.println("map to :" + str);
                     return str;
                 }).subscribe();
     }
    
  2. flatMap方法:

    • flatMap方法用于将Flux中的每个元素进行一对多的转换。
    • 对于每个元素,flatMap方法会应用一个转换函数,该函数返回一个新的Flux。
    • flatMap方法会将每个转换后的Flux合并成一个新的Flux,并且不保证转换后的元素的顺序。
    • 转换函数的返回值必须是一个Flux。
     @Test
     public void test(){
         String a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
         String[] split = a.split("(?!^)");
         Flux.just(split)
                 .flatMap(s->{
                     String str = s + s;
                     System.out.println("flatmap to :" + str);
                     return Flux.just(str);
                 })
                 .subscribe();
     }
    
  3. concatMap方法:

    • concatMap方法类似于flatMap,也是用于一对多的转换。
    • flatMap不同的是,concatMap方法保证转换后的元素的顺序与原始Flux中的元素顺序一致。
    • 转换函数的返回值必须是一个Flux。
     @Test
     public void test(){
         String a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
         String[] split = a.split("(?!^)");
         Flux.just(split)
                 .concatMap(s->{
                     String str = s + s;
                     System.out.println("flatmap to :" + str);
                     return Flux.just(str);
                 })
                 .subscribe();
     }
    

总结:

  • map:用于一对一的转换,返回一个新的Flux,元素顺序不变。
  • flatMap:用于一对多的转换,返回一个新的Flux,元素顺序可能发生变化。
  • concatMap:用于一对多的转换,返回一个新的Flux,元素顺序与原始Flux中的元素顺序保持一致。

选择使用哪种方法取决于具体的业务需求和对元素顺序的要求。如果不关心元素顺序,可以考虑使用flatMap,它的并行执行可以提高性能。如果要保持元素顺序,可以使用concatMap,但要注意可能会影响性能。而map适用于简单的一对一转换场景。