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. Oracle 高水位(HWM: High Water Mark) 说明

    一. 准备知识:ORACLE的逻辑存储管理. ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操 ...

  2. EXPLAIN命令

    EXPLAIN命令   除了以SELECT开头的查询语句,其余的DELETE.INSERT.REPLACE以及UPDATE语句前边都可以加上EXPLAIN这个词儿,用来查看这些语句的执行计划   Ty ...

  3. leetcode 平衡二叉树

    给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 . 示例 1: 输入:root = [3,9,20,n ...

  4. 【Android逆向】算法还原2

    这题比较简单 1. app-release.apk 安装至手机 提示需要输入账号和密码 2. jadx 打开看看 public native boolean check(byte[] bArr, by ...

  5. 一个有意思的问题:Kafka的消费Offset会溢出吗

    最近在项目上接入公司APP产品的用户点击日志数据时,发现消费者组的Offset值非常大,才一天的时间,已提交的Offset值就有千亿级别了. 于是不禁想了一个问题:假设一个Topic就只有一个Part ...

  6. 硬件开发笔记(十二):RK3568底板电路电源模块和RTC模块原理图分析

    前言   做硬件做系统做驱动,很难从核心板做起,所以我们先依赖核心板,分析底板周围的电路,然后使用AD绘制原理图和设计PCB,打样我司测试底板,完成硬件测试,再继续系统适配,驱动移植,从而一步一步完善 ...

  7. 命令行解析parse.parse_know_args()

    简介 在接受到多余的命令行参数时不报错,只把第一个参数作为当前使用的命令参数, 剩余部分留给其它程序使用,返回一个tuple类型的命名空间和一个保存着余下的命令行字符的list 示例 import a ...

  8. [BAT面试题系列]乐观锁和悲观锁

    基本概念 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题(使用非常广泛,不局限于某种编程语言或数据库). 乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据.因此乐观锁不会上锁, ...

  9. Redis动态配制,限内存,免重启

    p.p1 { margin: 0; font: 14px Menlo; color: rgba(0, 255, 255, 1); background-color: rgba(0, 0, 0, 0.8 ...

  10. .Net之多语言配置

    介绍 支持多语言使网站可以覆盖更广泛的受众. ASP.NET Core 提供的服务和中间件可将网站本地化为不同的语言. 本次示例环境:vs2019.net5 配置 无需引用Nuget包即可实现以下功能 ...