首页 > 其他分享 >Flux中的map、flatMap、concatMap的区别

Flux中的map、flatMap、concatMap的区别

时间:2023-07-28 13:56:29浏览次数:30  
标签:map flatMap 转换 元素 Flux concatMap

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适用于简单的一对一转换场景。

标签:map,flatMap,转换,元素,Flux,concatMap
From: https://www.cnblogs.com/daydreamer-fs/p/17587371.html

相关文章

  • WebFlux
    WebFlux个人理解:webflux跟springmvc功能类似,区别是实现异步非阻塞。是spring家族中的响应式web框架。以全新的java9后的响应式编程编写,具有前瞻性。同时,webflux是基于Reactor框架,并且以数据流处理为中心的框架。类型java中Stream流,具有流的一些特点。(需要关闭流了才传递)WebFlu......
  • IoT 场景下 InfluxDB 与 TDengine 的性能对比测试报告出炉!点击查看
    为了验证TDengine3.0在IoT场景下的性能,我们针对第三方基准性能测试平台TSBS(TimeSeriesBenchmarkSuite)中的IoT场景,预设了五种规模的卡车车队基础数据集,在相同的AWS云环境下对TDengine3.0和InfluxDB1.8(该版本是InfluxDB能够运行TSBS框架的最新版本)进行了对......
  • Docker部署Jmeter+Grafana+InfluxDB
      一:服务器配置Hosthssh505HostName180.184.138.70Port22Userroot前置条件:windows需通过softether客户端连接VPN本机ip:192.168.1.44二:安装docker安装命令:aptinstalldocker.io验证版本:2种方式docker--versiondocker-v出现版本信息则意味着安装成功:Docker......
  • 分布式多协议接入网关FluxMQ-2.0功能说明
    FluxMQ—2.0版本更新内容前言FLuxMQ是一款基于java开发,支持无限设备连接的云原生分布式物联网接入平台。FluxMQ基于Netty开发,底层采用Reactor3反应堆模型,具备低延迟,高吞吐量,千万、亿级别设备连接;方便企业快速构建其物联网平台与应用。FluxMQ官网:https://www.fluxmq.comFluxMQ......
  • Jmeter+Influxdb+garafana分布式压测+平台监控
    Jmeter+Influxdb+garafana分布式压测+平台监控 一、Jmeter 1、修改配置文件 主机:remote_hosts部分,修改内容为:remote_hosts=xx,xx代表的是压力机的ip:port 执行机:remote_hosts=本机ip+端口号、server_port=1099、server.rmi.localport=1099 2、主机和执行机都需下载......
  • 【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析
    前言在进行性能测试时,我们需要对测试结果进行监控和分析,以便于及时发现问题并进行优化。Locust在内存中维护了一个时间序列数据结构,用于存储每个事件的统计信息。这个数据结构允许我们在Charts标签页中查看不同时间点的性能指标,但是正因为LocustWebUI上展示的数据实际上是存储......
  • spring-boot-webflux-servlet-websocket-2.x 示例响应式编程
    这里是一个使用SpringBootWebFlux结合Servlet和WebSocket的示例代码:首先,确保在pom.xml文件中添加以下依赖:<dependencies><!--SpringBootWebFlux--><dependency><groupId>org.springframework.boot</groupId><artifactId>sprin......
  • Jmeter学习之七_使用influxdb2.7和grafana10进行Jmeter测试结果展示的方法
    Jmeter学习之七_使用influxdb2.7和grafana10进行Jmeter测试结果展示的方法摘要前几天验证了线程组内的-监听器jp@gc相关的组件以及验证了server-agent的方式可以监控机器的性能表现.但是发现很多结果集是比较杂乱并且不太好查看的.然后查了些资料可以使用influxdb......
  • influxdb 中得 fields 与 tag 区别总结
    本位为博主原创,转载请注明出处:1.Field与Tag说明在InfluxDB表结构中,field和tag是用于存储数据的两种不同类型。Field(字段):Field用于存储实际的数值数据,例如温度、湿度等测量值。Field是可变的,可以随时间的推移而改变其值。Field的值可以进行聚合计算,例如......
  • 深入浅出时序数据库之预处理篇——批处理和流处理,用户可定制,但目前流行influxdb没有做
    时序数据是一个写多读少的场景,对时序数据库以及数据存储方面做了论述,数据查询和聚合运算同样是时序数据库必不可少的功能之一。如何支持在秒级对上亿数据的查询分组聚合运算成为了时序数据库产品必须要面对的挑战。 本文会从时序数据库的查询以及聚合运算角度展开,最后会从如何解决......