Mono 功能介紹與使用示例

Mono 功能介紹與使用示例

一、核心概念與特性

Mono 是 Spring Reactor 框架中的核心組件,屬于響應式編程(Reactive Programming)模型,專注于處理包含 0 或 1 個元素 的異步序列[1][2][5]。其核心特點包括:

  • 異步非阻塞:通過 Reactive Streams 規范實現,適用于高并發場景[1][5]。
  • 冷信號:僅在訂閱(subscribe)時執行,支持延遲計算[1][4]。
  • 資源高效:相比傳統多線程模型,Mono 通過事件驅動減少資源消耗[1]。
二、核心功能與操作符
1. 創建 Mono 實例
  • Mono.just(T value):創建包含單個值的 Mono[1][2]。
    Mono<String> mono = Mono.just("Hello, Mono!");
    
  • Mono.empty():創建空 Mono,表示無返回值[1][4]。
    Mono<Void> emptyMono = Mono.empty();
    
  • 從異步源創建:支持 Mono.fromCallable()Mono.fromCompletionStage() 等[1][3]。
    Mono<String> mono = Mono.fromCallable(() -> {Thread.sleep(1000); // 模擬延遲return "Async Result";
    });
    
2. 轉換與映射
  • map(Function):對值進行轉換[1][2]。
    mono.map(s -> s.toUpperCase()).subscribe(System.out::println); // 輸出 "HELLO, MONO!"
    
  • flatMap(Function):處理嵌套 Mono,展平結果[2][5]。
    Mono<String> result = mono.flatMap(s -> Mono.just(s + " Processed"));
    
3. 過濾與默認值
  • filter(Predicate):基于條件過濾值[1][4]。
    Mono<String> filtered = mono.filter(s -> s.startsWith("H"));
    
  • defaultIfEmpty(T defaultValue):當 Mono 為空時提供默認值[2][5]。
    Mono.empty().defaultIfEmpty("Default Value").subscribe(System.out::println);
    
4. 錯誤處理
  • onErrorReturn(T fallback):捕獲異常并返回備用值[1][4]。
    Mono.error(new RuntimeException("Error")).onErrorReturn("Fallback Value").subscribe(System.out::println); // 輸出 "Fallback Value"
    
  • onErrorResume(Function):捕獲異常后繼續執行另一個 Mono[2][5]。
    Mono.error(new RuntimeException("Error")).onErrorResume(e -> Mono.just("Recovered")).subscribe(System.out::println); // 輸出 "Recovered"
    
5. 組合與終端操作
  • 組合多個 Mono:使用 concatWithzipWith[3][4]。
    Mono<String> combined = user1.concatWith(user2); // 依次執行
    
  • 終端操作:強制同步獲取結果[1][5]。
    String result = mono.block(); // 阻塞等待結果
    
三、使用場景與示例
場景 1:異步數據庫查詢
public Mono<User> getUserById(String id) {return Mono.fromCallable(() -> {// 模擬數據庫訪問Thread.sleep(500);return new User(id, "John Doe");});
}// 調用鏈
getUserById("123").map(User::getName).flatMap(name -> Mono.just("Hello, " + name)).subscribe(System.out::println); // 輸出 "Hello, John Doe"
場景 2:異常處理與默認值
Mono<String> errorMono = Mono.error(new IllegalArgumentException("Invalid ID"));errorMono.onErrorReturn("Default User").subscribe(result -> System.out.println("Result: " + result)); // 輸出 "Result: Default User"
場景 3:定時任務與延遲執行
Mono<String> delayedMono = Mono.just("Delayed Response").delayElement(Duration.ofSeconds(2)); // 延遲 2 秒delayedMono.subscribe(result -> System.out.println("Received: " + result));
四、優勢總結
  • 簡化異步代碼:通過鏈式調用替代回調地獄[1][3]。
  • 高效資源利用:冷信號機制避免無效計算,適合高并發[1][5]。
  • 靈活的錯誤處理:提供多種異常恢復策略[2][4]。

注意:Mono 與 Flux 的核心區別在于 Flux 可處理 0 到 N 個元素,而 Mono 僅針對單一或空值場景[3][5]。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910614.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

5060Ti雙顯卡+LLaMA-factory大模型微調環境搭建

查看環境確定安裝版本安裝CUDA12.8安裝Anaconda安裝Visual Studio C桌面開發環境&#xff08;編譯llama.cpp需要&#xff09;安裝cmake(編譯llama.cpp需要)安裝llama.cpp(用于量化)安裝huggingface-cli安裝llama-factory安裝PyTorch2.7.0安裝bitsandbytes安裝flash-attention加…

Lnmp和XunRuiCMS一鍵部署(Rocky linux)

先上傳XunRuiCMS-Study.zip包到當前目錄&#xff0c;可以去官網下載 #!/bin/bash # function: install nginx mysql php on Rocky Linux 9.5 with fixed PHP-FPM configip$(hostname -I | awk {print $1}) yhxunrui passwordxunrui123# 檢查是否為root用戶 if [ "$USER&qu…

高精度OFDR設備在CPO交換機中的應用

光電共封裝&#xff08;CPO&#xff09;交換機的特點 核心需求&#xff1a;CPO將光模塊與交換芯片集成封裝&#xff0c;縮短電互連距離&#xff0c;降低功耗和延遲&#xff0c;但需解決以下挑戰&#xff1a; 1.光器件微型化&#xff1a;硅光芯片、光纖陣列等需高精度制造。 …

Vulkan 通過 CMake 集成 Dear ImGUI

一、 目錄與文件部署 從官網獲取 IMGUI 代碼庫&#xff0c;在項目 extern 目錄下新建 imgui 目錄&#xff0c;將相關文件復制進去&#xff0c;構建出如下目錄結構&#xff1a; . ├── build ├── extern │ ├── glfw │ ├── glm │ └── imgui │ ├…

Linux設備框架:kset與kobject基本介紹

系列文章目錄 Linux設備框架&#xff1a;kset與kobject基本介紹 [link] Linux設備框架&#xff1a;kset與kobject源碼分析 [link] kset與kobject基本介紹 一、前言二、kobject、kset和設備的關系2.1 kset 結構體2.2 kobject 結構體 三、總結 一、前言 Linux 設備模型如同一座擁…

【AI論文】擴展大型語言模型(LLM)智能體在測試時的計算量

摘要&#xff1a;擴展測試時的計算量在提升大型語言模型&#xff08;LLMs&#xff09;的推理能力方面已展現出顯著成效。在本研究中&#xff0c;我們首次系統地探索了將測試時擴展方法應用于語言智能體&#xff0c;并研究了該方法在多大程度上能提高其有效性。具體而言&#xf…

LeapMotion-PhysicalHandsManager 類詳解

PhysicalHandsManager 類詳解 這個類是 Ultraleap 物理手交互系統的核心管理器,負責處理手部物理交互的不同模式。下面我將詳細解析這個類的結構和功能: 類概述 PhysicalHandsManager 繼承自 LeapProvider,是物理手交互系統的中央控制器: public class PhysicalHandsMa…

vue-22(理解組合式 API:setup、ref、reactive)

Vue.js 中的組合式 API 代表了我們構建和組織組件方式的重大轉變。它為傳統的選項式 API 提供了一種更靈活、更強大的替代方案&#xff0c;尤其適用于復雜的應用程序。本章將深入探討組合式 API 的核心概念&#xff1a;setup函數、ref和reactive&#xff0c;為你構建更可維護、…

【Golang玩轉MCP】-實現一個加減乘除MCP服務

文章目錄 概要1 首先創建一個MCP服務器2 添加MCP工具如何測試我們的MCP服務功能是否正常呢小結 概要 今天我們使用golang簡單實現一個加減乘除MCP服務 1 首先創建一個MCP服務器 s : server.NewMCPServer("Hello World Server","1.0.0",server.WithToolCa…

計算機網絡期末 網絡基礎概述

目錄 網絡的定義歷史發展(了解) 網絡的分類&#xff0c;功能和應用(熟悉) 網絡的組成與結構(理解) 網絡的 OSI 七層參考模型(熟悉) 網絡的 TCP/IP 四次模型(理解) 網絡有關性能指標(掌握) 網絡的定義歷史發展(了解) 計算機網絡是什么 四個階段 總結 網絡 互連網 因特網的…

SwiftUI學習筆記day4: Lecture 4 | Stanford CS193p 2023

Lecture 4 | Stanford CS193p 2023 課程鏈接&#xff1a;https://www.youtube.com/watch?v4CkEVfdqjLw 代碼倉庫&#xff1a;iOS 課程大綱&#xff1a; 簡要課程大綱&#xff1a;SwiftUI 高級主題 Swift 訪問控制&#xff08;Access Control&#xff09; 5 個級別&#xff1…

Docker 高級管理——容器通信技術與數據持久化

目錄 一、Docker 容器的網絡模式 1. Bridge 模式 2. Host 模式 3. Container 模式 4. None 模式 5. Overlay 模式 6. Macvlan 模式 7. 自定義網絡模式 二、端口映射 1. 端口映射 2. 隨機映射端口 3. 指定映射端口 &#xff08;1&#xff09;固定端口 &#xff08;…

git操作案例 -設置遠程分支,并提交到新遠程新分支

文章目錄 前言一、分析當前的問題二、修改遠程倉庫地址&#xff08;一&#xff09;修改遠程倉庫地址場景 現有保留遠程分支場景替換現有遠程分支 二、 找回已經提交的文件場景&#xff1a;提交后&#xff0c;代碼在本地倉庫但未推送 三、同步遠程分支四、提交到新遠程的新分支 …

mysql一張表,其中一個字段設置了唯一索引,又設置了普通索引,查詢的時候很慢,沒有走普通索引,是const

問題分析 在 MySQL 中&#xff0c;當一個字段同時存在唯一索引和普通索引時&#xff0c;查詢優化器通常會優先選擇最嚴格的索引&#xff08;即能最快縮小結果集的索引&#xff09;。在你的場景中&#xff0c;優化器選擇了唯一索引并將查詢視為const類型&#xff0c;這通常是高…

ARCGIS國土超級工具集1.6更新說明

ARCGIS國土超級工具集V1.6版本&#xff0c;功能已增加至60 個。本次更新在V1.5版本的基礎上&#xff0c;除修復了使用時發現的若干小問題外&#xff0c;還更新及新增了若干工具。其中勘測定界工具欄更新了界址點西北角重排工具&#xff0c;新增了提示圖斑起始點、指定圖斑起始點…

零基礎學習RabbitMQ(2)--Linux安裝RabbitMQ

注意&#xff1a;這里使用的是ubuntu系統 1. 安裝Erlang RabbitMQ需要Erlang語言的支持&#xff0c;在安裝rabbitMQ之前需要安裝Erlang #更新軟件包 sudo apt-get update #安裝erlang sudo apt-get install erlang 安裝后輸入 rel可查看Erlang版本&#xff1a; 輸入halt().…

Centos進單用戶模式

一、開機按E 二、修改里面的linux行 把ro 修改成rw init/sysroot/bin/sh 修改前&#xff1a; 修改后&#xff1a; 三、ctrl x退出&#xff0c;進入單用戶模式

RabbitMQ 的工作流程

RabbitMQ 是一個消息中間件&#xff0c;實現了生產者消費者模型&#xff0c;可以用來接收、存儲、轉發消息。 專有名詞介紹 要了解 RabbitMQ 的工作流程&#xff0c;我們需要先了解下面幾個關鍵詞&#xff1a; 1、Producer 生產者&#xff0c;即向 RabbitMQ 發送消息。 2…

HTTP——不同版本區別

目錄 HTTP1.0和HTTP1.1的區別 HTTP1.1相比HTTP1.0性能上的改進&#xff1a; 但是HTTP1.1還是有性能瓶頸&#xff1a; HTTP/2做了什么優化&#xff1f; HTTP/3的優點 HTTP與HTTPS的區別 HTTPS的工作原理 1.ClientHello 2.ServerHello 3.客戶端回應 4.服務器的最后回應…

關于M0+芯片的IAP應用導致延時不準確解釋

前言&#xff1a;在給項目中使用的M0芯片做IAP功能時一切一切都是那么的自然水到渠成&#xff0c;但是筆者在實現完IAP功能后&#xff0c;卻發現APP端掛載的單總線功能崩潰了&#xff0c;最開始沒有懷疑是bootload導致的。因為筆者在使用同一篇代碼的時候單總線掛載的設備不同&…