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();
    }
  4. switchMap

    类似于 flatMap 操作符,它也会将每个元素映射成一个新的数据流。但是它只会处理最近的数据流,而忽略之前未完成的数据流。如果在处理最近的数据流时,又来了一个新的数据流,它会放弃之前的数据流并处理最新的数据流。switchMap 操作符是异步执行的,会涉及到线程切换。

总结:

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

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

Flux中的map、flatMap、concatMap的区别的更多相关文章

  1. RxJava【变换】操作符 map flatMap concatMap buffer MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. JAVA中List,Map,Set接口的区别

    从三点来分析它们之间的不同: 1.继承的接口不同: List,Set接口都是继承于Collection接口的,而Map接口不是,它是一个顶层接口. 2.自身特点: List:用来处理序列的.对于放于的 ...

  3. Swift中的map 和 flatMap 原理及用法

    之前对这两个概念有点糊,今天正好遇到一个相关需求,才深入了解了下. 需求如下: 大概就是对一个数组的model,重构成一个新model,返回得到一个新数组 用map很容易实现,不过后来我需要对其中进行 ...

  4. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  5. Java中集合List,Map和Set的区别

    Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...

  6. JS中的 map, filter, some, every, forEach, for in, for of 用法总结和区别

    JS中的 map, filter, some, every, forEach, for in, for of 用法总结和区别  :https://blog.csdn.net/hyupeng1006/a ...

  7. JS中map与forEach的区别

    很多同学可能对于map与forEach的区别不是太了解,今天我们介绍一下JS中的map与forEach方法, 我对map的理解是,这个方法对一个数组arr1中的每一个元素进行遍历(传递给一个数组,参数 ...

  8. 原 c++中map与unordered_map的区别

    c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...

  9. map集合中value()、keySet()、entrySet()区别

    在Map集合中 values():方法是获取集合中的所有的值----没有键,没有对应关系, KeySet():将Map中所有的键存入到set集合中.因为set具备迭代器.所有可以迭代方式取出所有的键, ...

  10. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

随机推荐

  1. springboot 实现拦截的 3 种方式介绍及异步执行的思考

    springboot 拦截方式 实际项目中,我们经常需要输出请求参数,响应结果,方法耗时,统一的权限校验等. 本文首先为大家介绍 HTTP 请求中三种常见的拦截实现,并且比较一下其中的差异. (1)基 ...

  2. Spring boot集成log4j2

    spring boot默认使用的是logback作为日志框架,那如何使用log4j2呢?下面就给大家介绍一下集成步骤: 此处我使用的是spring boot 2.1.2 1.新建一个spring bo ...

  3. win32 - 将剪贴板位图存储为文件

    简单的demo: #include <iostream> #include <fstream> #include <windows.h> typedef struc ...

  4. JSON排除指定字段的4种方法

    转自:https://blog.csdn.net/Sn_Keys/article/details/122443407

  5. mp4v2开发笔记(一): mp4v2库介绍,mp4v2在ubuntu上交叉编译移植到海思Hi35xx平台

    前言   在海思上需要将h264码流封装成mp4可使用mp4v2库.   其他相关   <Qt开发笔记之编码x264码流并封装mp4(四):mp4v2库的介绍和windows平台编译>   ...

  6. vscode中跑go test时打印详细信息配置

    1.文件>首选项>设置>搜索Test Flags 2.选择在settings.json中编辑 3.添加以下内容 "go.testFlags":[ "-v ...

  7. centos8.x阿里源配置

    >>> cd /etc/yum.repo.d >>> mkdir bak >>> mv *.repo bak/ >>> cd b ...

  8. linux下安装django2.2

    安装 pip3 install django==2.2 创建项目 django-admin startproject pyweb 创建应用 django-admin startapp app01 修改 ...

  9. 【Azure API 管理】如何修改Azure APIM的管理员邮箱和组织名称

    问题描述 当创建一个新的APIM服务时,会要求输入组织名称(Organization name)和管理员邮箱(Administrator email :Set the e-mail address t ...

  10. Binlog分析利器-binlog_summary.py

    ​Binlog中,除了具体的SQL,其实,还包含了很多有价值的信息,如, 事务的开始时间. 事务的结束时间. 事务的开始位置点. 事务的结束位置点. 操作的开始时间(一个事务通常会包含多个操作). 表 ...