最近,我的一位同事向我介绍了Project Reactor类型的expand运算符,在这篇文章中,我想介绍几种使用它的方式。

展开分页结果

考虑在名为City的模型上基于Spring Data的存储库:

 import org.springframework.data.jpa.repository.JpaRepository;  import samples.geo.domain.City;  public interface CityRepo extends JpaRepository<City, Long> {  } 

该存储库提供了一种检索分页结果的方法,大致如下:

 cityRepo.findAll(PageRequest.of( 0 , 5 )) 

现在,如果我要将多个页面展开到一个结果中,执行此操作的方法将是以下一种循环:

 var pageable: Pageable = PageRequest.of( 0 , 5 )  do { var page: Page<City> = cityRepo.findAll(pageable) page.content.forEach { city -> LOGGER.info( "City $city" ) } pageable = page.nextPageable()  } while (page.hasNext()) 

可以使用Reactor expand运算符通过以下方式完成分页结果的等效展开:

 val result: Flux<City> = Mono .fromSupplier { cityRepo.findAll(PageRequest.of( 0 , 5 )) } .expand { page -> if (page.hasNext()) Mono.fromSupplier { cityRepo.findAll(page.nextPageable()) } else Mono.empty() } .flatMap { page -> Flux.fromIterable(page.content) }  result.subscribe( { page -> LOGGER.info( "City ${page}" ) }, { t -> t.printStackTrace() }  ) 

在这里,结果的第一页扩展到第二页,第二页扩展到第三页,依此类推,直到没有要检索的页面为止。

遍历一棵树

考虑以下模型表示的树结构中的节点:

 data class Node( val id: String, val nodeRefs: List<String>,  ) 

样本数据如下所示:


可以使用如下所示的调用遍历:

 val rootMono: Mono<Node> = nodeService.getNode( "1" )  val expanded: Flux<Node> = rootMono.expand { node -> Flux.fromIterable(node.childRefs) .flatMap { nodeRef -> nodeService.getNode(nodeRef) }  }  expanded.subscribe { node -> println(node) } 

这是广度优先的扩展,输出如下所示:

 Node- 1  Node- 1 - 1  Node- 1 - 2  Node- 1 - 1 - 1  Node- 1 - 1 - 2  Node- 1 - 2 - 1  Node- 1 - 2 - 2 

expandDeep变体将深度优先遍历

翻译自: https://www.javacodegeeks.com/2020/02/project-reactor-expand-method.html

Project Reactor展开方法相关推荐

  1. reactor使用方法_Project Reactor展开方法

    reactor使用方法 最近,我的一位同事向我介绍了Project Reactor类型的expand运算符,在这篇文章中,我想介绍几种使用它的方式. 展开分页结果 考虑在名为City的模型上基于Spr ...

  2. 使用Spring Boot和Project Reactor处理SQS消息

    我最近参与了一个项目,在该项目中,我不得不有效地处理通过AWS SQS Queue流入的大量消息. 在这篇文章(可能还有一篇)中,我将介绍使用出色的Project Reactor处理消息的方法. 以下 ...

  3. 使用Spring Boot和Project Reactor处理SQS消息-第2部分

    这是我关于使用Spring Boot和Project Reactor有效处理SQS消息的博客文章的后续文章 我在第一部分中列出了一些方法上的差距. 1.处理SQS客户端调用中的失败 2.该方法一次只能 ...

  4. ⒈响应式编程 Project Reactor 概述

    文章目录 What is Reactive Programming? Project Reactor & Reactive Programming 总览 Features Best pract ...

  5. 【SpringWebFlux】Project Reactor的使用

    Spring Framework从版本5开始,基于Project Reactor支持响应式编程. Project Reactor是用于在JVM上构建非阻塞应用程序的Reactive库,基于Reacti ...

  6. cad钣金展开插件_户外垃圾桶顶盖钣金拆分展开方法

    今天给大家讲解一个户外垃圾箱顶盖的拆分展开方法如下图 拆分零件如下 对称的两个零件如下 打开SolidWorks,新建草图如下 点击拉伸凸台命令 设置参数如下 点击倒圆角命令 设置参数 选择下面蓝色面 ...

  7. cad钣金展开插件_简单的钣金CAD展开方法

    问:我也是钣金人,怎么加入组织? 答:点标题下方蓝字"钣金学习网 一.结构 1.此图是A边折弯20,B边折弯30,C边折弯41,即ABC三边有2道折弯.宽度50MM. 2.板厚T=1.0,我 ...

  8. C++之initializer_list,可变参数模板参数展开方法

    initializer_list介绍 模板initializer_list是C++11新增的,可以使用初始化列表语法将STL容器初始化为一系列值,在使用 { }来进行初始化的时候,其实是调用了将 in ...

  9. 不同钣金展开方法对比研究与应用

    摘要:近年来,机械加工领域的快速发展,使更加先进的零件加工技术不断产生.钣金加工是机械加工中的重要组成部分,钣金件的成形精度将直接影响到钣金件的后续使用,但其成形精度在很大程度上则是由钣金件展开尺寸所 ...

最新文章

  1. Revit LT 2022基本培训 Revit LT 2022 Essential Training
  2. JAVA学习笔记--4.多线程编程 part5.这些年的那些坑
  3. python中dtypes_关于python:如何通过pandas DataFrame中的列设置dtypes
  4. 达索系统“体验时代中的制造业”大型活动探索工业数字化转型
  5. Modular Java
  6. Sqlserver常用函数例子说明
  7. C11中gets()的函数被删除
  8. WebLogic 12c 中压缩传输的配置
  9. android8.1 audio hal关键结构分析(二十五)
  10. python3web库_基于 Python3 写的极简版 webserver
  11. Linux编译Opencv3.4.7: relocation R_X86_64_PC32 against `ff_w_ff‘ can not be used when makin with -fPIC
  12. 程序内购买 图文攻略
  13. 天若OCR v5.0 自用免配置增强版
  14. 计算机232接口接线图,串口线(232接口详细接线图)
  15. 忘记vmware虚拟机系统登入密码如何破解,破解vmware登录密码。
  16. html设置单元格不可编辑状态,excel单元格不能编辑 如何取消Excel 2013中单元格的直接编辑状态...
  17. Node.js内置模块 events的基本使用
  18. mysql和sqlite3 ios_iOS数据库存储之SQLite3
  19. 读书笔记 | 自动驾驶中的雷达信号处理(第9章 汽车雷达的应用概述)
  20. alta公司1553b板卡编程相关

热门文章

  1. MST(最小生成树)的构造
  2. 图像处理作业 第8次
  3. SpringCloud Ribbon(五)之服务实例列表ServerList
  4. JavaFX UI控件教程(二十八)之UI控件的自定义
  5. 关于Unsafe类的一点研究
  6. JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)
  7. publiccms实现首页菜单栏下拉的方法
  8. 投资理财要趁早,基金风险是最小!
  9. React向对象数组进行赋值
  10. volatile可以保证原子性吗