当前位置: 首页 > news >正文

java中的Optional

在 Java 8 中,Optional 是一个用于处理可能为 null 的值的容器类,旨在减少空指针异常(NullPointerException)并提升代码的可读性。以下是 Optional 的核心用法和最佳实践:


1. 创建 Optional 对象

1.1 常规创建方式
  • Optional.of(T value)
    创建一个包含非空值的 Optional。如果传入 null,会抛出 NullPointerException

    Optional<String> name = Optional.of("Alice");
    
  • Optional.ofNullable(T value)
    允许传入 null,若值为 null,返回空的 Optional

    Optional<String> nullableName = Optional.ofNullable(getName()); // 若 getName() 返回 null,nullableName 为空
    
  • Optional.empty()
    创建一个空的 Optional

    Optional<String> empty = Optional.empty();
    

2. 访问 Optional 中的值

2.1 检查值是否存在
  • isPresent()
    判断 Optional 是否包含值。

    if (name.isPresent()) {System.out.println("值存在: " + name.get());
    }
    
  • ifPresent(Consumer<? super T> consumer)
    如果值存在,执行传入的操作。

    name.ifPresent(n -> System.out.println("值存在: " + n));
    
  • isEmpty()(Java 11+)
    判断 Optional 是否为空。

    if (empty.isEmpty()) {System.out.println("Optional 为空");
    }
    
2.2 安全获取值
  • get()
    直接获取值,但需确保值存在(否则抛出 NoSuchElementException)。

    String result = name.get(); // 若 name 为空,抛出异常
    
  • orElse(T other)
    若值存在返回该值,否则返回默认值。

    String defaultName = nullableName.orElse("Default Name");
    
  • orElseGet(Supplier<? extends T> supplier)
    orElse() 类似,但默认值由 Supplier 延迟生成。

    String generatedName = nullableName.orElseGet(() -> "Generated Name");
    
  • orElseThrow(Supplier<? extends X> exceptionSupplier)
    若值不存在,抛出指定异常。

    String actualName = nullableName.orElseThrow(() -> new IllegalArgumentException("值不存在"));
    

3. 转换与过滤 Optional 中的值

3.1 map(Function<? super T, ? extends U> mapper)

Optional 中的值进行转换,返回新的 Optional

Optional<String> upperCaseName = name.map(String::toUpperCase);
upperCaseName.ifPresent(System.out::println); // 输出: ALICE
3.2 flatMap(Function<? super T, Optional<U>> mapper)

用于处理嵌套的 Optional,避免嵌套结构。

Optional<Optional<String>> nested = Optional.of(name);
Optional<String> flattened = nested.flatMap(o -> o); // 展平为 Optional<String>
3.3 filter(Predicate<? super T> predicate)

根据条件过滤值,若条件不满足,返回空的 Optional

Optional<String> longName = name.filter(n -> n.length() > 5);
longName.ifPresent(System.out::println); // 若 name 为 "Alice"(长度 5),不输出

4. 链式操作示例

结合 mapfilterorElse 实现链式调用:

Optional<User> user = getUser();
String city = user.map(User::getAddress).map(Address::getCity).orElse("Unknown City");
System.out.println("城市: " + city);

5. Optional 的最佳实践

✅ 推荐做法
  1. 方法返回值处理
    当方法可能返回 null 时,返回 Optional<T> 而不是 null

    public Optional<User> findUserById(String id) {// ...
    }
    
  2. 链式操作替代嵌套判断
    mapflatMap 替代多层 if-else

    // 传统方式
    User user = getUser();
    if (user != null) {Address address = user.getAddress();if (address != null) {System.out.println(address.getCity());}
    }// 使用 Optional
    Optional.ofNullable(user).map(User::getAddress).map(Address::getCity).ifPresent(System.out::println);
    
  3. 提供默认值
    使用 orElseorElseGet 处理缺失值。

    String name = Optional.ofNullable(user).map(User::getName).orElse("Guest");
    
⚠️ 常见误区
  1. 不要用 Optional 声明类字段
    Optional 不适合用作类的字段,因为序列化和反序列化可能存在问题。

    // ❌ 不推荐
    private Optional<String> name;
    
  2. 避免滥用 get()
    直接调用 get() 前必须检查值是否存在。

    // ❌ 错误
    String name = optional.get(); // ✅ 正确
    String name = optional.orElseThrow(() -> new RuntimeException("值不存在"));
    
  3. 不要过度使用 Optional
    仅在明确“值可能缺失”的场景使用,避免过度设计。

    // ❌ 不推荐
    public Optional<String> getName() { ... }// ✅ 推荐
    public String getName() { return Optional.ofNullable(...).orElse(""); }
    

6. OptionalStream 的结合

Optional 可以与 Stream 结合使用,处理集合中的空值:

List<Optional<String>> optionalNames = ...;
List<String> names = optionalNames.stream().filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());

7. 总结

方法用途示例
of创建非空的 OptionalOptional.of("Hello")
ofNullable创建允许为 nullOptionalOptional.ofNullable(getName())
isPresent检查值是否存在optional.isPresent()
ifPresent若存在则执行操作optional.ifPresent(System.out::println)
orElse提供默认值optional.orElse("Default")
map转换值optional.map(String::toUpperCase)
flatMap展平嵌套的 Optionaloptional.flatMap(o -> o)
filter过滤值optional.filter(s -> s.length() > 5)
orElseThrow若无值则抛出异常optional.orElseThrow(() -> new RuntimeException("无值"))

通过合理使用 Optional,可以显著减少空指针异常的风险,同时使代码更简洁、意图更明确。

相关文章:

java中的Optional

在 Java 8 中&#xff0c;Optional 是一个用于处理可能为 null 的值的容器类&#xff0c;旨在减少空指针异常&#xff08;NullPointerException&#xff09;并提升代码的可读性。以下是 Optional 的核心用法和最佳实践&#xff1a; 1. 创建 Optional 对象 1.1 常规创建方式 Op…...

原型和原型链

原型&#xff08;Prototype&#xff09; 和 原型链&#xff08;Prototype Chain&#xff09; 是 JavaScript 中非常重要的概念&#xff0c;它们是 JavaScript 实现继承和共享属性和方法的核心机制。理解原型和原型链可以帮助你更好地掌握 JavaScript 的面向对象编程&#xff08…...

解锁Python TDD:从理论到实战的高效编程之道(9/10)

引言 在 Python 开发的广袤天地中&#xff0c;确保代码质量与稳定性是每位开发者的核心追求。测试驱动开发&#xff08;TDD&#xff0c;Test-Driven Development&#xff09;作为一种强大的开发理念与实践方法&#xff0c;正逐渐成为 Python 开发者不可或缺的工具。TDD 强调在…...

OpenMCU(七):STM32F103开发环境搭建

概述 本文主要讲述了使用Keil软件搭建STM32F103嵌入式开发环境的步骤&#xff0c;主要面向想从事嵌入式行业的入门同学&#xff0c;如果下面的讲述过程中有不对的地方&#xff0c;欢迎大家给我留言。 本文主要讲述了Keil 5.43的安装教程&#xff0c;主要用于学习交流&#xf…...

六、Hive 分桶

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 专栏&#xff1a;Hive教程 在 Hive 中&#xff0c;除了常见的分区&#xff08;Partitioning&#xff09;&#xff0c;分桶&#xff08;Bucketing&#xff09;是另一种重要且有效的数据组织和性能优化手段。它允许我们…...

INFINI Console 纳管 Elasticsearch 9(一):指标监控、数据管理、DSL 语句执行

Elasticsearch v9.0 版本最近已发布&#xff0c;而 INFINI Console 作为一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台&#xff0c;是否支持最新的 Elasticsearch v9.0 集群管理呢&#xff1f;本文以 INFINI Console v1.29.2 为例&#xff0c;从指标监控、数…...

ansible进阶版01

ansible进阶版01 欢迎使用Markdown编辑器最佳实践保持简单 保持井然有序&#xff08;有组织的&#xff09;经常测试 git工作原理 chapter 2编写ymal格式的主机清单 欢迎使用Markdown编辑器 最佳实践 保持简单 使用yaml的原生语法使用自带模块尽量使用专用模块&#xff0c;不…...

python文件打包成exe文件

✅ 一、安装 PyInstaller 打开cmd&#xff0c;输入以下代码 pip install pyinstaller✅ 二、打包指令 比如说你有如下的文件需要打包。 首先复制你的文件所在目录&#xff0c;比如我的是C:\Users\Administrator\Desktop\BearingSearchSystem 在cmd中切换到该目录来&#xf…...

人脸识别系统中的隐私与数据权利保障

首席数据官高鹏律师创作 如今人脸识别技术以其高效、便捷的特性广泛应用于各个领域&#xff0c;从安防监控到移动支付&#xff0c;从门禁系统到社交媒体。然而&#xff0c;这项技术在为我们的生活带来诸多便利的同时&#xff0c;也引发了一系列关于隐私与数据权利的深刻担忧。…...

电脑关机再开机会换IP吗?深入解析分配机制

在日常使用电脑时&#xff0c;许多用户可能会好奇&#xff1a;‌关机后再开机&#xff0c;IP地址会不会变化&#xff1f;‌ 这个问题看似简单&#xff0c;但实际上涉及多个因素。本文将详细解析电脑IP地址的变化机制&#xff0c;帮助大家理解其中的原理&#xff0c;并提供相关的…...

经典中的经典-比特币白皮书中文版

AI是一切假的集合&#xff0c;如果任凭AI如此聪明下去&#xff0c;所有的人都将被AI愚弄与股掌之间&#xff0c;那么能限制AI的只有区块链这个让一切数据都无处遁形的真神&#xff0c;而比特币作为区块链的鼻祖&#xff0c;开创了公开账本的先河&#xff0c;当互联网上所有的信…...

Spring事务失效的全面剖析

文章目录 1. Spring事务基础1.1 什么是Spring事务1.2 Spring事务的实现原理1.3 `@Transactional`注解的主要属性1.4 使用Spring事务的简单示例2. Spring事务失效的常见场景及解决方案2.1 方法不是public的问题描述问题示例解决方案技术原理解释2.2 自调用问题(同一个类中的方法…...

本地的ip实现https访问-OpenSSL安装+ssl正式的生成(Windows 系统)

1.下载OpenSSL软件 网站地址&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 安装: 一直点击下一步就可以了 2.设置环境变量 在开始菜单右键「此电脑」→「属性」→「高级系统设置」→「环境变量」 在Path 中添加一个: xxxx\OpenSSL-…...

【go】binary包,大小端理解,read,write使用,自实现TCP封包拆包案例

binary.LittleEndian 是 Go 语言 encoding/binary 包中的一个常量&#xff0c;用于指定字节序&#xff08;Byte Order&#xff09;。字节序是指多字节数据在内存中存储的顺序&#xff0c;有两种主要方式&#xff1a; 小端序&#xff08;Little Endian&#xff09;&#xff1a;…...

[万字]qqbot开发记录,部署真寻bot+自编插件

这是我成功部署真寻bot以及实现一个自己编写的插件&#xff08;连接deepseek回复内容&#xff09;的详细记录&#xff0c;几乎每一步都有截图。 正文&#xff1a; 我想玩玩qqbot。为了避免重复造轮子&#xff0c;首先选一个github的高星项目作为基础吧。 看了一眼感觉真寻bot不…...

国内USB IP商业解决方案新选择:硬件USB Server

在数字化办公日益普及的今天&#xff0c;USB OVER NETWORK技术&#xff0c;即USB IP技术&#xff0c;为企业带来了前所未有的便捷与高效。作为这一领域的佼佼者&#xff0c;朝天椒USB Server以其卓越的性能和贴心的设计&#xff0c;正逐步成为众多中国企业的首选USB IP商业解决…...

百度导航广告“焊死”东鹏特饮:商业底线失守,用户安全成隐忧

近日&#xff0c;百度地图因导航时植入“广告”的问题登上社交媒体热搜&#xff0c;并引发广泛争议。 截图自微博 导航途中出现“焊死”在路面的广告 安全隐患引争议 多位网友发帖称&#xff0c;在使用百度地图导航时&#xff0c;导航界面中的公路路面上出现了“累了困了喝东…...

yolo11n-obb训练rknn模型

必备&#xff1a; 准备一台ubuntu22的服务器或者虚拟机&#xff08;x86_64&#xff09; 1、数据集标注&#xff1a; 1&#xff09;推荐使用X-AnyLabeling标注工具 2&#xff09;标注选【旋转框】 3&#xff09;可选AI标注&#xff0c;再手动补充&#xff0c;提高标注速度 …...

GNU Screen 曝多漏洞:本地提权与终端劫持风险浮现

SUSE安全团队全面审计发现&#xff0c;广泛使用的终端复用工具GNU Screen存在一系列严重漏洞&#xff0c;包括可导致本地提权至root权限的缺陷。这些问题同时影响最新的Screen 5.0.0版本和更普遍部署的Screen 4.9.x版本&#xff0c;具体影响范围取决于发行版配置。 尽管GNU Sc…...

无人机避障——如何利用MinumSnap进行对速度、加速度进行优化的轨迹生成(附C++python代码)

&#x1f525;轨迹规划领域的 “YYDS”——minimum snap&#xff01;作为基于优化的二次规划经典&#xff0c;它是无人机、自动驾驶轨迹规划论文必引的 “开山之作”。从优化目标函数到变量曲线表达&#xff0c;各路大神疯狂 “魔改”&#xff0c;衍生出无数创新方案。 &#…...

2025 3D工业相机选型及推荐

3D工业相机是专门为工业应用设计的三维视觉采集设备&#xff0c;能够获取物体的三维空间信息&#xff0c;在智能制造、质量检测、机器人引导等领域有广泛应用。 一、主要类型 1.结构光3D相机 通过投射特定光斑或条纹图案并分析变形来重建三维形状 典型代表&#xff1a;双目结构…...

芋道(yudao-cloud)项目,后端接口报401-账号未登录解决方案

一、需求 最近公司有新的业务需求&#xff0c;调研了一下&#xff0c;决定使用芋道&#xff08;yudao-cloud&#xff09;框架,于是从github&#xff08;https://github.com/YunaiV/yudao-cloud&#xff09;上克隆项目&#xff0c;选用的是jdk17版本的。根据项目启动手册&#…...

动态域名服务ddns怎么设置?如何使用路由器动态域名解析让外网访问内网?

设置路由器的动态域名解析&#xff08;DDNS&#xff09;&#xff0c;通常需先选择支持 DDNS 的路由器和提供 DDNS 服务的平台&#xff0c;然后在路由器管理界面中找到 DDNS 相关设置选项&#xff0c;填入在服务平台注册的账号信息&#xff0c;完成配置后保存设置并等待生效。 …...

论文《Collaboration-Aware Graph Convolutional Network for Recommender Systems》阅读

论文《Collaboration-Aware Graph Convolutional Network for Recommender Systems》阅读 论文概况Introduction and MotivationMethodologyLightGCN 传播形式CIRCAGCNImplementation Experiments 论文概况 论文《Collaboration-Aware Graph Convolutional Network for Recomm…...

Codis集群搭建和集成使用的详细步骤示例

以下是Codis集群搭建和集成使用的详细步骤示例&#xff1a; 环境准备 安装Go语言环境 下载并安装适配操作系统的Go语言版本。配置环境变量GOROOT和GOPATH。 安装ZooKeeper 下载ZooKeeper压缩包&#xff0c;解压并进入目录。复制conf/zoo_sample.cfg为conf/zoo.cfg。启动ZooKe…...

利用比较预言机处理模糊的偏好数据

论文标题 ComPO:Preference Alignment via Comparison Oracles 论文地址 https://arxiv.org/pdf/2505.05465 模型地址 https://huggingface.co/ComparisonPO 作者背景 哥伦比亚大学&#xff0c;纽约大学&#xff0c;达摩院 动机 DPO算法直接利用标注好的数据来做偏好对…...

《数据库原理》部分习题解析

《数据库原理》部分习题解析 1. 课本pg196.第1题。 &#xff08;1&#xff09;函数依赖 若对关系模式 R(U) 的任何可能的关系 r&#xff0c;对于任意两个元组 t₁ 和 t₂&#xff0c;若 t₁[X] t₂[X]&#xff0c;则必须有 t₁[Y] t₂[Y]&#xff0c;则称属性集 Y 函数依赖…...

【HCIA】浮动路由

前言 我们通常会在出口路由器配置静态路由去规定流量进入互联网默认应该去往哪里。那么&#xff0c;如果有两个运营商的路由器都能为我们提供上网服务&#xff0c;我们应该如何配置默认路由呢&#xff1f;浮动路由又是怎么一回事呢&#xff1f; 文章目录 前言1. 网络拓扑图2. …...

基于机器学习的卫星钟差预测方法研究HPSO-BP

摘要 本文研究了三种机器学习方法&#xff08;BP神经网络、随机森林和支持向量机&#xff09;在卫星钟差预测中的应用。通过处理GPS和GRACE卫星的钟差数据&#xff0c;构建了时间序列预测模型&#xff0c;并比较了不同方法的预测性能。实验结果表明&#xff0c;优化后的BP神经…...

机器学习中分类模型的常用评价指标

评价指标是针对模型性能优劣的一个定量指标。 一种评价指标只能反映模型一部分性能&#xff0c;如果选择的评价指标不合理&#xff0c;那么可能会得出错误的结论&#xff0c;故而应该针对具体的数据、模型选取不同的的评价指标。 本文将详细介绍机器学习分类任务的常用评价指…...

AI 检测原创论文:技术迷思与教育本质的悖论思考

当高校将 AI 写作检测工具作为学术诚信的 "电子判官"&#xff0c;一场由技术理性引发的教育异化正在悄然上演。GPT-4 检测工具将人类创作的论文误判为 AI 生成的概率高达 23%&#xff08;斯坦福大学 2024 年研究数据&#xff09;&#xff0c;这种 "以 AI 制 AI&…...

langchain学习

无门槛免费申请OpenAI ChatGPT API搭建自己的ChatGPT聊天工具 https://nuowa.net/872 基本概念 LangChain 能解决大模型的两个痛点&#xff0c;包括模型接口复杂、输入长度受限离不开自己精心设计的模块。根据LangChain 的最新文档&#xff0c;目前在 LangChain 中一共有六大…...

蓝桥杯 10. 全球变暖

全球变暖 原题目链接 题目描述 你有一张某海域 N x N 像素的照片&#xff1a; . 表示海洋# 表示陆地 例如如下所示&#xff1a; ....... .##.... .##.... ....##. ..####. ...###. .......在照片中&#xff0c;“上下左右”四个方向上连在一起的一片陆地组成一座岛屿。例…...

OpenTiny icons——超轻量的CSS图标库,引领图标库新风向

我们非常高兴地宣布 opentiny/icons 正式发布啦&#xff01; 源码&#xff1a;https://github.com/opentiny/icons&#xff08;欢迎 Star ⭐&#xff09; 官网&#xff1a;https://opentiny.github.io/icons/ 图标预览&#xff1a;https://opentiny.github.io/icons/brow…...

python使用OpenCV 库将视频拆解为帧并保存为图片

python使用OpenCV 库将视频拆解为帧并保存为图片 import cv2 import osdef video_to_frames(video_path, output_folder, frame_prefixframe_, interval1, target_sizeNone, grayscaleFalse):"""将视频拆分为帧并保存为图片参数:video_path (str): 视频文件路径…...

[论文阅读]ControlNET: A Firewall for RAG-based LLM System

ControlNET: A Firewall for RAG-based LLM System [2504.09593] ControlNET: A Firewall for RAG-based LLM System RAG存在数据泄露风险和数据投毒风险。相关研究探索了提示注入和投毒攻击&#xff0c;但是在控制出入查询流以减轻威胁方面存在不足 文章提出一种ai防火墙CO…...

机器学习 --- 数据集

机器学习 — 数据集 文章目录 机器学习 --- 数据集一&#xff0c;sklearn数据集介绍二&#xff0c;sklearn现实世界数据集介绍三&#xff0c;sklearn加载数据集3.1 加载鸢尾花数据集3.2 加载糖尿病数据集3.3 加载葡萄酒数据集 四&#xff0c;sklearn获取现实世界数据集五&#…...

在Ubuntu服务器上部署Label Studio

一、拉取镜像 docker pull heartexlabs/label-studio:latest 二、启动容器 &#xff08;回到用户目录&#xff0c;例&#xff1a;输入pwd&#xff0c;显示 /home/<user>&#xff09; docker run -d --name label-studio -it -p 8081:8080 -v $(pwd)/mydata:/label-st…...

机器学习07-归一化与标准化

归一化与标准化 一、基本概念 归一化&#xff08;Normalization&#xff09; 定义&#xff1a;将数据缩放到一个固定的区间&#xff0c;通常是[0,1]或[-1,1]&#xff0c;以消除不同特征之间的量纲影响和数值范围差异。公式&#xff1a;对于数据 ( x )&#xff0c;归一化后的值…...

用vue和go实现登录加密

前端使用CryptoJS默认加密方法&#xff1a; var pass CryptoJS.AES.encrypt(formData.password, key.value).toString()使用 CryptoJS.AES.encrypt() 时不指定加密模式和参数时&#xff0c;CryptoJS 默认会执行以下操作 var encrypted CryptoJS.AES.encrypt("明文&quo…...

服务器制造业中,L2、L6、L10等表示什么意思

在服务器制造业中&#xff0c;L2、L6、L10等是用于描述服务器生产流程集成度的分级体系&#xff0c;从基础零件到完整机架系统共分为L1-L12共12个等级。不同等级对应不同的生产环节和交付形态&#xff0c;以下是核心级别的具体含义&#xff1a; L2&#xff08;Level 2&#xf…...

mysql8常用sql语句

查询结果带行号 -- 表名为 mi_user&#xff0c; 假设包含列 id &#xff0c;address SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_num, t.id, t.address FROM mi_user t ; SELECT ROW_NUMBER() OVER ( ) AS row_num, t.id, t.address FROM mi_user t ; 更新某列数…...

多模态RAG与LlamaIndex——1.deepresearch调研

摘要 关键点&#xff1a; 多模态RAG技术通过结合文本、图像、表格和视频等多种数据类型&#xff0c;扩展了传统RAG&#xff08;检索增强生成&#xff09;的功能。LlamaIndex是一个开源框架&#xff0c;支持多模态RAG&#xff0c;提供处理文本和图像的模型、嵌入和索引功能。研…...

汽车工厂数字孪生实时监控技术从数据采集到三维驱动实现

在工业智能制造推动下&#xff0c;数字孪生技术正成为制造业数字化转型的核心驱动力。今天详细介绍数字孪生实时监控技术在汽车工厂中的应用&#xff0c;重点解析从数据采集到三维驱动实现的全流程技术架构&#xff0c;并展示其在提升生产效率、降低成本和优化决策方面的显著价…...

深度解码双重订阅用户:高价值流量池的掘金指南

在流量红利消退的当下&#xff0c;内容平台与电商平台的竞争已进入白热化阶段。数据显示&#xff0c;2023年全球用户平均每日切换应用频次超过200次&#xff0c;但仅有3%的用户愿意为多个平台持续付费。这3%的群体——“双重订阅用户”&#xff0c;正成为商业价值最高的流量金矿…...

MATLAB Simulink在Autosar和非Autosar工程下的开发流程

软件开发有两种方法&#xff1a;自上而下和自下而上。自上而下就是从整体出发去设计各个模块和模块间的接口&#xff0c;要求架构设计人员对产品功能非常清楚&#xff1b;自下而上就是从一个一个模块出发去设计&#xff0c;进而组成一个整体。自下而上可能会带来冗余代码过多和…...

使用DevEco Studio性能分析工具高效解决鸿蒙原生应用内存问题

目录 一、内存问题的识别与初步判断 1.1 内存问题的常见表现 1.2 使用 DevEco Profiler 的实时监控功能 1.2.1 打开 Profiler 工具 1.2.2 监控内存变化 1.2.3 判断内存异常 1.2.4 示例代码:模拟内存泄漏 二、内存问题的定界与定位 2.1 使用 Snapshot/Allocation 模板分…...

AI视频生成工具开发与搭建:从技术到应用的全方位指南

随着AI技术的飞速发展&#xff0c;视频创作的门槛被大幅降低。无论是个人用户还是企业开发者&#xff0c;都能通过AI工具实现照片转动态、视频爆改创意、小程序开发等多样化需求。本文将从技术开发、工具应用及行业趋势三个维度&#xff0c;深度解析AI视频生成的核心技术与实践…...

【android bluetooth 框架分析 02】【Module详解 7】【VendorSpecificEventManager 模块介绍】

1. 背景 我们在 gd_shim_module 介绍章节中&#xff0c;看到 我们将 VendorSpecificEventManager 模块加入到了 modules 中。 // system/main/shim/stack.cc modules.add<hci::VendorSpecificEventManager>();在 ModuleRegistry::Start 函数中我们对 加入的所有 module…...

Docker环境下的Apache NiFi安装实践踩坑记录

引言:由于最近用到数据同步&#xff0c;故打算采用中间件工具来做数据同步&#xff0c;谁知第一步部署Apache NiFi环境就耽搁了好久&#xff0c;其中遇到一些问题&#xff0c;故记录下来部署成功记录 问题1&#xff1a;HTTPS访问 HTTP ERROR 400 Invalid SNI问题2&#xff1a;…...