Rails ActiveRecord数据库关系n:n

Java响应式编程实战:Flux与Mono核心概念、操作符及背压机制详解 响应式编程是一种基于异步数据流和变化传播的编程范式,其核心原理在于将数据视为随时间推移而发出的连续事件序列,并通过声明式操作符进行组合与转换。这种模式的技术价值在于能够高效处理高并发、高吞吐量的实时数据场景,有效利用系统资源,避免线程阻塞。在微服务架构、实时数据处理和IoT物联网等应用场景中,响应式流(Reactive Streams)通过背压(Backpressure)机制实现流量控制,确保下游消费者不会被上游快速生产的数据淹没。本文聚焦于Java生态中的Project Reactor库,深入解析其核心组 阅读详情

    如图所示,在demo数据库中有assemblies和parts两张表。一个assembly有多个part,一个part也拥有多个assembly,是一个n:n关系。


1.建立数据表

      由于n:n的关系是以中间表的形式表达的,所以需要创建图示中的三张表assemlies, parts和中间表assemlies_part。

 

      编辑db/migrate/目录下新建的xxxx_create_assemblies_and_parts.rb文件,在该文件中定义中间表:


       注意,该表包含n:n的两端表的主键,且自身不使用主键,故:id=>false。

       另外,该中间表的表名是“assemblies_part“,以中间的下划线连接两张表,并且按照字母顺序小在前字母顺序大的在后排列,如果创建”part_assemlies“表,则rails可能找不到该中间表。

       实际上,rails是以string的”<“操作来比较单词的,所以,如果不确定哪个表在前哪个在后,可以使用该操作符确定一下再创建表。比如有两张表”devil_x“和"devilx"(为什么会有人取这么奇怪的表名呢),那就需要自己来确认一下中间表的表名:


      所以,中间表的表名应该是“devil_x_devilx”。

      最后,确认创建数据表:


2.修改model,添加关系

      在关系的两端都需要添加has_and_belongs_to_many。



3.操作关系

       在n:n关系的两端都添加了如下方法:


      可以看到,添加的方法和has_many关系添加的方法相同,所以就不再重复介绍使用方法。

响应式编程实战:Flux与Mono流式操作符详解与背压机制解析 响应式编程是一种基于数据流和变化传播的编程范式,其核心原理在于采用声明式、异步非阻塞的方式处理数据流,通过观察者模式实现数据生产者与消费者之间的解耦。这一技术价值在于能够显著提升系统资源利用率,尤其在高并发、高延迟的微服务架构中,能够有效避免线程阻塞,支撑海量并发连接。其典型应用场景包括实时数据推送、消息驱动系统、高并发API网关以及实时监控大盘等。本文聚焦于Project Reactor库中的Flux与Mono这两个核心抽象,它们分别代表多元素和单元素的数据流,是构建响应式系统的基石。通过详解其丰富的流式 阅读详情

相关推荐

响应式编程核心:Mono概念、实战与避坑指南

响应式编程是构建高并发IO密集型应用的重要范式,其核心思想是将耗时操作异步化,避免线程阻塞。在Java生态中,Project Reactor提供了Mono和Flux两种发布者类型,其中Mono用于表达0..1个元素的异步结果载体,类似异步世界的Optional。理解Mono的创建、转换、错误处理和订阅机制,是掌握响应式开发的关键。通过实际代码示例,可以学会使用just、defer、flatMap、onErrorResume等操作符构建健壮的异步链路,并规避冷流热流、线程调度、背压控制等常见问题。本文面向Ja

weixin_33883104的博客 303

mysql设计表之间的联系_数据库设计中表之间的关系(1:1 1:N N:N)和在数据库中的实现...

1)数据库的设计(1)表的关系(2)设计准则2)多表之间的关系 及其 在数据库中的实现(1)1对1: 如人和身份证 --> 不常见student学生表id name age cid(这个要外键唯一)1 洪七公 85 12 周伯通 75 2card身份证表id number1 6122432342 52...

weixin_36358109的博客 849

反应式编程的魅力:Reactive Streams与Reactor框架探索

本文探讨了Reactive Streams编程模型的核心概念及其在现代软件开发中的应用。我们分析了Reactor框架的设计原理,强调了其在处理异步数据流、实现高效的错误处理和回压机制方面的优势。通过实例,展示了Reactive Streams在微服务架构和实时数据处理中的重要性。希望通过这篇文章,读者能够深入理解响应式编程的价值,并在实际开发中灵活应用这一强大工具。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 6万+

数据库设计中表之间的关系(1:1 1:N N:N)和在数据库中的实现

1)数据库的设计 (1)表的关系 (2)设计准则 2)多表之间的关系 及其 在数据库中的实现 (1)1对1: 如人和身份证 --> 不常见 student学生表 id name age cid(这个要外键唯一) 1 洪七公 85 1 2 周伯通 75 2 card身份证表 id number 1 612243234 2 523241423 解决办法:可以在.

focus-unchanged-thing 9557

Linux下离线安装Google Chrome

目录背景一、下载并安装Google Chrome二、下载并安装依赖包1.libvulkan.so.1()(64bit)2.读入数据总结 背景 项目中服务器被要求不能连接外网,不能直接联网安装,所以需要下载Google Chrome安装包和依赖包,然后离线安装。 linux下步骤都一样,不管ubuntu还是centos只是需要下载对应系统的文件包即可。 本机系统:CentOS 7 一、下载并安装Google Chrome 官方下载地址http://www.google.cn/chrome/browser/d

ancientapesman的博客 1万+

Dell Precision 7920 Tower开机点不亮?别慌,看电源灯闪烁密码快速定位故障(附BIOS恢复指南)

本文详细解析了Dell Precision 7920 Tower工作站开机点不亮时的电源灯闪烁密码,帮助用户快速定位故障。从内存问题到BIOS恢复,再到CPU配置错误,提供了全面的诊断和修复指南,并附有实用的维护建议和工具推荐。

weixin_30892037的博客 486

数据库设计中常见表结构的设计技巧

一、树型关系的数据表不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况。当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据。按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构:类别表_1(T

littledream的专栏 3万+

基于 MATLAB 的综合能源系统建模:全面解析与案例应用 

本文详细介绍了基于 MATLAB 的综合能源系统建模相关知识,包括 MATLAB 在综合能源建模中的优势、综合能源系统各组件和网络的建模方法,并通过园区综合能源系统的案例展示了从建模到优化调度求解以及结果分析的全过程。在当今全球能源格局深刻变革的背景下,综合能源系统(Integrated Energy System,IES)作为一种创新的能源供应体系,整合了多种能源形式,如电力、热力、燃气等,以实现能源的高效生产、传输、分配和利用。需要考虑燃气的压力、流量特性以及管道的阻力特性等。

qq_57128262的博客 1336

优化数据页面(22)——n:n的数据关系

设计要点:优化数据页面、界面设计、美化exce 阿金:那n::n就复杂了,你倒是想留有空间。但是现实社会有时却不允许。 秀秀:唉!说的也是。 阿金:那怎么表达才合适啊? 秀秀:只有用网格了。 阿金:就是最俗的那种? 秀秀:那怎么办? 阿金:“现实”打败 “理想”了吧?! 秀秀:唉,“小资”也只能偶尔享受一下啊。   表3  网格结构的n:n  

uibook的专栏 670

STM32F407通过SMBus协议精准读取BQ40Z50电池电量

本文详细介绍了STM32F407通过SMBus协议精准读取BQ40Z50电池电量的实现方法。从硬件连接到软件驱动开发,再到通信异常排查,提供了完整的解决方案。重点解析了SMBus协议的特殊时序要求、GPIO模拟驱动的关键代码,以及实际调试中的常见问题与对策,帮助开发者高效完成电池管理系统开发。

weixin_29189003的博客 253

Qt6安装保姆级教程:从国内镜像下载到配置避坑指南(附清华/中科大源)

本文提供详细的Qt6安装与配置指南,重点介绍如何利用清华大学、中国科学技术大学等国内镜像源解决下载速度慢的问题。内容涵盖在线安装器获取、组件选择策略、环境变量配置以及常见编译与部署问题的排查方法,旨在帮助国内开发者高效、顺畅地完成Qt6开发环境搭建。

weixin_29281915的博客 634

1:n和n:n 表之间关联

其实表和表之间相互关联就是笛卡尔积的关系, A表: B表: A表的user_id 和B表的user_id的关系为n:n,关联之后就是A表的user_id的个数m乘以B表user_id的个数的乘积。 A表的order_no和B表的order_no的关系为1:1,两个表关联之后,同一个order_no只有一条数据: ...

健康平安的活着的专栏 2538

改进yolov8|BackBone改进:PWConv、FasterNeXt替换yolov8主干网络

各位哥哥姐姐弟弟妹妹大家好,我是干饭王刘姐,主业干饭,主业2.0计算机研究生在读。和我一起来改进yolov8变身计算机大牛吧!本文中的论文笔记都是刘姐亲自整理,原创整理哦~

weixin_44379985的博客 752

Spring AI:WebFlux响应式编程

Reactive Streams 是 JVM 面向流的库的标准和规范:1、处理可能无限数量的元素2、有序3、在组件之间异步传递元素4、强制性非阻塞,背压模式(背向压力:先将数据放入到缓冲区,然后再根据缓冲区去取,一种本地化MQ消息队列思想(类似于观察者模式),而RockerMQ是处理的系统之间的MQ,Reactive Stream是处理单系统内部的异步)

人不风流枉少年 270

在ubuntu20.04中安装MATLAB时常见问题及解决方法

   如果你刚装完ubuntu20.04,这时你想要安装MATLAB2021A,在输入命令./install进行安装时,可能会报以下错误:    terminate called after throwing an instance of ‘JailContainerException’ what(): Error: 88: No JRE version parsed from/media/jzx/MATHWORKS_R2021A/sys /java/jre/glnxa64/jre/release   

慕羽★的博客 1万+

openharmony之UniProton内核技术揭秘:鸿蒙面向工业控制领域的RTOS设计之道

UniProton是鸿蒙操作系统面向工业控制领域的轻量级实时操作系统(RTOS),专为资源受限的嵌入式设备设计。作为鸿蒙生态的重要组成部分,UniProton提供了高效的实时任务调度、内存管理和IPC机制,满足工业控制场景对实时性和可靠性的严格要求。想象一下,UniProton就像一个超级聪明的管家,管理着电子设备里所有的工作。让你的智能手表既能显示时间,又能接收消息让家里的扫地机器人既能避开障碍物,又能记住哪里已经打扫过了让工厂里的机器人手臂既能精确地抓取东西,又能快速地完成任务实时性强。

m0_67505153的博客 884

WebFlux使用

当我们运行这段代码时,将输出 “Result: 2”、“Result: 4”、“Result: 6”、“Result: 8”、“Result: 10”,分别对应原始值的两倍。是一种实现了 Reactive Streams 规范的发布者(Publisher),它可以发送一个或零个元素,并提供了丰富的操作符来处理异步流。当我们运行这段代码时,将输出 “Value: 42”,表示我们成功创建了一个包含值 42 的 Mono,并且成功接收到该值。方法接受一个参数作为元素的值,并返回一个包含该元素的 Mono。

libing__123的博客 625

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【WebFlux】第二篇 —— Project Reactor 核心数据类型与doOnXXX介绍

在 Spring WebFlux 的底层,真正支撑起异步非阻塞数据流转的,是一个名为 Project Reactor 的核心库。如果说 Reactive Streams 是响应式编程的“交通规则”,那么 Project Reactor 就是按照这套规则制造出的“超级跑车”。这些钩子只会“观察”数据流,而不会改变数据流本身,是调试响应式代码的利器。:Mono 和 Flux 是响应式编程的容器,理解了它们的惰性执行机制和生命周期信号,我们就掌握了控制数据流的钥匙。这是响应式编程中最反直觉、但也最核心的特性。

NWU_LK的博客 386

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

响应式操作实战案例

注意,所有事件,甚至终止事件,都是可选的:没有 onNext 事件,但是 onComplete 事件表示一个空的有限序列,但是移除 onComplete 并且你有一个无限的空序列(除了关于取消的测试之外,没有特别有用)。如果我们已经有了一个数组、一个 Iterable 对象或 Stream 对象,那么就可以通过 Flux 提供的 fromXXX() 方法组来从这些对象中自动创建 Flux,包括 fromArray()、fromIterable() 和 fromStream() 方法。

S&Y_shhy_QQ_1127833416 980

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java深入解析篇五十之Project Reactor

/ 自定义parallel调度器// 自定义boundedElastic调度器20, // 最大线程数1000, // 队列容量"my-io" // 线程名前缀// 从已有Executor创建// 使用完毕后释放规则说明不要 block()在响应式链中永远不要调用 block()用 defer 包装有副作用的创建用 defer/fromCallable显式错误处理每个外部调用都应有错误处理策略合理选择调度器。

萧瑟余晖的博客 346

一文详解响应式编程springwebflux

详解springwebflux使用

工匠精神coding,终生学习 1250

Spring Boot WebClient 从入门到精通:非阻塞HTTP客户端实战指南

在微服务架构和云原生应用中,高效的HTTP客户端通信是构建高并发、低延迟系统的关键技术。其核心原理在于采用非阻塞I/O模型,通过事件驱动机制,在少量线程上处理大量并发连接,从而大幅提升资源利用率和系统吞吐量。这一技术价值在于能够支撑现代应用对实时性和弹性的要求,广泛应用于服务间调用、API集成、数据聚合等场景。Spring WebClient作为Spring官方推荐的响应式HTTP客户端,基于Project Reactor构建,完美体现了这一技术范式。本文聚焦于WebClient的实战应用,详细解析其核心A

weixin_30652491的博客 437

Java函数式编程与响应式编程实践指南

函数式编程通过将函数作为一等公民,实现了行为参数化和声明式编程,显著提升代码简洁性和可维护性。其核心机制如Lambda表达式和函数式接口(Functional Interface),使得开发者能够专注于业务逻辑而非控制流程。响应式编程(Reactive Programming)在此基础上扩展,通过数据流和异步处理模型应对高并发场景,典型实现如Spring Reactor框架。这两种范式在现代Java开发中形成协同效应,既能通过无状态特性避免并发问题,又能利用非阻塞IO提升系统吞吐量。特别是在微服务架构和实时

weixin_30455023的博客 363

Reactor响应式编程实战:业务解耦与异步编排化繁为简

响应式编程是一种基于数据流和变化传播的编程范式,其核心原理是通过声明式流水线描述异步数据的组装、变换与消费。在Java生态中,Project Reactor通过Mono/Flux抽象订阅式数据流,将并发调度、结果拼装和异常恢复拆分到独立操作符中,配合背压机制控制上下游速率,从而显著降低业务编排复杂度。该技术尤其适用于网关聚合、消息处理、长流程订单等IO密集型场景,能够将类似CompletableFuture的命令式异步替代为可组合的声明式链条,实现关注点分离与性能优化。本文结合下单链路实践,展示Reacto

weixin_31220401的博客 298

【WebFlux】第三篇 —— 常用操作符与数据流转换

本文介绍了Reactor框架中四种核心响应式流操作符:转换类(map/flatMap)、过滤类(filter/distinct)、组合类(merge/concat)和聚合类(reduce/collectList)。重点对比了map(同步1对1转换)与flatMap(异步1对N转换)的区别,并通过代码示例展示了各类操作符的典型用法。最后强调map/flatMap、filter和merge/concat是响应式编程的基础,指出当转换结果为普通对象时用map,结果为新流时用flatMap,为后续学习异常处理和单元

NWU_LK的博客 201

Spring AI 2.0:Flux

mapfilterdoOnNextdoOnErrordoFinallytimeoutretryWhentakeconcatWithreducescanflatMapconcatMap把Mono类比为“未来可能得到一个结果”,把Flux类比为“未来可能陆续得到多个结果”。

人不风流枉少年 245
上一篇: Rails ActiveRecord数据库关系1:1
下一篇: Rails ActiveRecord数据库关系1:n
qjpcpu
博客等级 码龄15年 59粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值