Project Reactor展开方法
最近,我的一位同事向我介绍了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展开方法相关推荐
- reactor使用方法_Project Reactor展开方法
reactor使用方法 最近,我的一位同事向我介绍了Project Reactor类型的expand运算符,在这篇文章中,我想介绍几种使用它的方式. 展开分页结果 考虑在名为City的模型上基于Spr ...
- 使用Spring Boot和Project Reactor处理SQS消息
我最近参与了一个项目,在该项目中,我不得不有效地处理通过AWS SQS Queue流入的大量消息. 在这篇文章(可能还有一篇)中,我将介绍使用出色的Project Reactor处理消息的方法. 以下 ...
- 使用Spring Boot和Project Reactor处理SQS消息-第2部分
这是我关于使用Spring Boot和Project Reactor有效处理SQS消息的博客文章的后续文章 我在第一部分中列出了一些方法上的差距. 1.处理SQS客户端调用中的失败 2.该方法一次只能 ...
- ⒈响应式编程 Project Reactor 概述
文章目录 What is Reactive Programming? Project Reactor & Reactive Programming 总览 Features Best pract ...
- 【SpringWebFlux】Project Reactor的使用
Spring Framework从版本5开始,基于Project Reactor支持响应式编程. Project Reactor是用于在JVM上构建非阻塞应用程序的Reactive库,基于Reacti ...
- cad钣金展开插件_户外垃圾桶顶盖钣金拆分展开方法
今天给大家讲解一个户外垃圾箱顶盖的拆分展开方法如下图 拆分零件如下 对称的两个零件如下 打开SolidWorks,新建草图如下 点击拉伸凸台命令 设置参数如下 点击倒圆角命令 设置参数 选择下面蓝色面 ...
- cad钣金展开插件_简单的钣金CAD展开方法
问:我也是钣金人,怎么加入组织? 答:点标题下方蓝字"钣金学习网 一.结构 1.此图是A边折弯20,B边折弯30,C边折弯41,即ABC三边有2道折弯.宽度50MM. 2.板厚T=1.0,我 ...
- C++之initializer_list,可变参数模板参数展开方法
initializer_list介绍 模板initializer_list是C++11新增的,可以使用初始化列表语法将STL容器初始化为一系列值,在使用 { }来进行初始化的时候,其实是调用了将 in ...
- 不同钣金展开方法对比研究与应用
摘要:近年来,机械加工领域的快速发展,使更加先进的零件加工技术不断产生.钣金加工是机械加工中的重要组成部分,钣金件的成形精度将直接影响到钣金件的后续使用,但其成形精度在很大程度上则是由钣金件展开尺寸所 ...
最新文章
- Revit LT 2022基本培训 Revit LT 2022 Essential Training
- JAVA学习笔记--4.多线程编程 part5.这些年的那些坑
- python中dtypes_关于python:如何通过pandas DataFrame中的列设置dtypes
- 达索系统“体验时代中的制造业”大型活动探索工业数字化转型
- Modular Java
- Sqlserver常用函数例子说明
- C11中gets()的函数被删除
- WebLogic 12c 中压缩传输的配置
- android8.1 audio hal关键结构分析(二十五)
- python3web库_基于 Python3 写的极简版 webserver
- Linux编译Opencv3.4.7: relocation R_X86_64_PC32 against `ff_w_ff‘ can not be used when makin with -fPIC
- 程序内购买 图文攻略
- 天若OCR v5.0 自用免配置增强版
- 计算机232接口接线图,串口线(232接口详细接线图)
- 忘记vmware虚拟机系统登入密码如何破解,破解vmware登录密码。
- html设置单元格不可编辑状态,excel单元格不能编辑 如何取消Excel 2013中单元格的直接编辑状态...
- Node.js内置模块 events的基本使用
- mysql和sqlite3 ios_iOS数据库存储之SQLite3
- 读书笔记 | 自动驾驶中的雷达信号处理(第9章 汽车雷达的应用概述)
- alta公司1553b板卡编程相关
热门文章
- MST(最小生成树)的构造
- 图像处理作业 第8次
- SpringCloud Ribbon(五)之服务实例列表ServerList
- JavaFX UI控件教程(二十八)之UI控件的自定义
- 关于Unsafe类的一点研究
- JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)
- publiccms实现首页菜单栏下拉的方法
- 投资理财要趁早,基金风险是最小!
- React向对象数组进行赋值
- volatile可以保证原子性吗