kotlin知识体系(六) : Flow核心概念与与操作符指南
1. Flow基础概念
1.1 冷流(Cold Stream)
冷流是Flow的默认形式,其核心特点如下:
• 按需触发:仅在消费者调用 collect
时开始发射数据,且每次收集都会重新执行流的逻辑(类似“单播”)。
• 独立性:同一流的多个消费者会各自触发独立的数据生产和发射流程。
• 适用场景:适用于一次性任务(如网络请求、数据库查询)或需要重复触发的场景。
代码示例:
val coldFlow = flow { emit("冷流开始发射数据") delay(1000)emit("数据发射完成")
}// 消费者1收集数据
coldFlow.collect { println("消费者1: $it") }// 消费者2再次收集会重新触发流的执行
coldFlow.collect { println("消费者2: $it") }
1.2 热流(Hot Stream)
热流的生命周期不与消费者绑定,特点如下:
• 主动发射:数据由生产者主动发射,无论是否有消费者订阅(类似“广播”)。
• 共享性:多个消费者共享同一流实例,接收到的是同一组数据的最新值或事件。
• 代表类型:StateFlow
(用于状态管理)、SharedFlow
(用于事件传递)。
适用场景:
• 实时状态同步(如UI状态更新)。
• 全局事件通知(如用户登录状态变动)。
代码示例:
// 热流示例(StateFlow)
val stateFlow = MutableStateFlow("初始值")// 生产者更新值(不依赖是否有消费者)
stateFlow.value = "新值" // 多个消费者共享同一最新值
stateFlow.collect { println("消费者A: $it") }
stateFlow.collect { println("消费者B: $it") }
1.3 数据流模型(Data Stream Model)
Flow采用生产者-消费者模型,通过异步非阻塞的机制和响应式编程思想,形成完整的处理链。
1.3.1 生产者-消费者分离
• 生产者(Producer)
负责生成数据流(如通过 emit
发送数据),可以是网络请求、数据库查询或传感器事件等。
fun fetchData(): Flow<String> = flow {val data = api.getData() // 模拟耗时操作emit(data)
}
• 消费者(Consumer)
订阅数据并处理(如更新UI、存储结果):
fetchData().collect { data ->updateUI(data) // 处理数据
}
1.3.2 异步非阻塞
Flow通过在协程中运行,实现以下特点:
• 非阻塞主线程:耗时操作(如IO)通过 flowOn(Dispatchers.IO)
切换到子线程。
• 挂起与恢复:使用挂起函数(如 delay
)可暂停流处理,无需回调嵌套。
1.3.3 响应式编程
• 实时响应:当数据变化时,自动推送新值(如 StateFlow
驱动UI刷新)。
• 链式处理:通过操作符(如 map
、filter
)组合复杂逻辑,例如:
flow { emit(1..5) }.flatMapConcat { it.asFlow() } // 展开数据.filter { it % 2 == 0 } // 过滤偶数.map { it * 2 } // 转换数据.collect { println(it) } // 输出:4, 8
1.4 关键总结
特性 | 冷流 | 热流 |
---|---|---|
触发方式 | 按需触发(被收集时才发射) | 主动发射 |
数据共享 | 消费者独立触发,数据独立 | 多消费者共享数据 |
适用场景 | 接口请求、数据库查询 | 状态共享(UI)、全局事件通知 |
2. Flow的构建方式
2.1 flow { ... }
flow
构建器是创建自定义Flow的核心方式,适用于需要手动控制数据发射逻辑的场景。其核心特点是通过 emit()
函数逐个发射数据,并通过挂起函数支持异步操作。
基础示例:模拟分页加载数据
fun loadPagesFlow(pageSize: Int): Flow<List<Item>> = flow {var page = 0while (true) {val items = fetchPage(page, pageSize) // 挂起函数获取分页数据emit(items) // 发射当前页数据if (items.size < pageSize) break // 数据不足时终止流page++}
}// 使用方式
viewModelScope.launch {loadPagesFlow(20).collect { items ->updateRecyclerView(items)}
}
关键特性:
• 冷流特性:每次收集都会重新执行 flow
块内的逻辑
• 线程限制:默认在调用者的协程上下文中运行,不可直接切换线程(需配合 flowOn
)
• 挂起支持:内部可使用 delay()
、withContext()
等挂起函数
适用场景:
• 需要逐条生成数据的异步任务(如实时聊天消息接收)
• 复杂的数据生成逻辑(如分页加载、传感器数据融合)
2.2 flowOf()
快速创建包含固定数据集的冷流,适用于已知静态数据的场景。其行为类似集合操作,但支持响应式处理链。
示例:创建预定义颜色值的流
val colorFlow = flowOf("Red", "Green", "Blue")// 等价于:
val colorFlow = flow {emit("Red")emit("Green")emit("Blue")
}
特殊用法:空数据流
val emptyFlow = flowOf<String>() // 创建不发射任何值的流
性能特点:
• 数据缓存在内存中,每次收集都会重新发射全部数据
• 适用于小规模固定数据集(≤1000条)
2.3 asFlow()
将现有集合或序列转换为冷流,实现集合数据与Flow操作符的无缝衔接。
集合转换示例:
val listFlow = listOf(1, 2, 3).asFlow()// 等价于:
val listFlow = flow {emit(1)emit(2)emit(3)
}
序列适配示例:
(1..10_000).asSequence() // 创建懒序列.filter { it % 2 == 0 } // 先进行过滤.asFlow() // 转换为Flow.map { it * 2 } // 继续Flow操作.collect { print(it) }
对比 flowOf()
:
flowOf(1, 2, 3) | listOf(1,2,3).asFlow() | |
---|---|---|
数据存储方式 | 独立参数存储 | 依赖原始集合对象 |
大数据性能 | 适合小数据集 | 适合超大规模集合(惰性处理) |
操作符兼容性 | 需转换为Flow操作符链 | 可衔接集合/序列预处理 |
3. Flow操作符详解
3.1 中间操作符
3.1.1 转换操作符
通过转换操作符,开发者可以对流中的每个元素进行实时修改或扩展,支持同步和异步处理。
-
map
• 功能:将数据转换为其他类型
• 场景:数据格式转换(如DTO → UI Model)
• 注意事项:内部可调用挂起函数(如网络请求)userFlow.map { user -> UserProfile(user.id, user.name) }
-
filter
• 功能:筛选符合条件的数据
• 场景:排除无效数据(如空值、非法范围值)
• 技巧:可filterIsInstance<T>()
,直接实现filter + map
操作符的效果intFlow.filter { num -> num % 2 == 0 }
-
transform
• 功能:复杂转换(可多次emit
)
• 场景:一对多转换(如展开嵌套集合)
• 典型用法:动态生成中间状态(如加载中→成功/失败)queryFlow.transform { query ->emit(Loading)emit(SearchResult(query)) }
3.1.2 组合操作符
组合多个流的数据,实现复杂的数据混合逻辑。
-
zip
• 功能:合并两个流,按顺序配对
• 触发条件:双方流在同一位置都有新元素时触发
• 终止条件:任一流结束则终止
• 场景:合并关联性强的数据(如用户ID + 用户详情)
• 特点:结果流长度等于较短流的长度val userIds = flowOf(1, 2, 3) val userNames = flowOf("Alice", "Bob") userIds.zip(userNames) { id, name -> "$id: $name" } // 输出:1: Alice, 2: Bob
-
combine
• 功能:动态合并流(任一更新触发)
• 触发条件:任一流发射新值时触发
• 终止条件:双方流都结束时终止
• 场景:实时仪表盘(温度+湿度)、输入框联动
• 特点:结果流长度 = 流A长度 + 流B长度 - 1val tempFlow = flowOf(25, 26) val humidityFlow = flowOf(60, 65) tempFlow.combine(humidityFlow) { t, h ->"$t℃/$h%" } // 输出:25/60 → 26/60 → 26/65
3.1.3 背压处理操作符
解决生产者-消费者速度不匹配的问题,提供多种流量控制策略。
-
buffer
• 功能:添加缓冲区,允许生产者和消费者异步运行
• 参数:capacity: Int
(默认64)
• 场景:生产者快于消费者时避免阻塞(如日志批量上传)
• 注意:缓冲区过大会增加内存压力fastFlow.buffer(100).collect { ... }
-
conflate
• 功能:丢弃中间值,只保留最新值
• 场景:UI刷新(如实时位置更新时,跳过中间帧)
• 典型问题:可能丢失关键历史数据locationFlow.conflate().collect { updateMap(it) }
-
collectLatest
• 功能:新元素到达时取消当前处理并重新开始
• 场景:搜索建议(用户持续输入时取消未完成请求)
• 要求:处理块必须是可取消的挂起函数inputFlow.collectLatest { searchApi(it) }
3.1.4 生命周期操作符
监控流的执行过程,实现资源管理和状态跟踪。
-
onStart
• 触发时机:流开始收集时
• 场景:显示加载动画、初始化资源
• 注意:即使流没有元素也会触发flow.onStart { showLoading() }
-
onCompletion
• 触发时机:流正常结束或取消时
• 参数:cause: Throwable?
(null表示正常结束)
• 场景:隐藏加载动画、释放资源flow.onCompletion { hideLoading() }
-
catch
• 作用域:捕获上游的所有异常
• 限制:无法捕获下游操作符和collect
中的异常
• 恢复策略:通过emit()
发射备用值flow.catch { e ->emit(ErrorData(e)) }
3.2 末端操作符
触发流的执行并处理最终结果。
-
collect
• 功能:启动流的收集,处理每个元素
• 返回值:Unit
• 场景:自定义处理逻辑(如更新UI)flow.collect { data -> println(data) }
-
toList
/toSet
• 功能:将流转换为集合
• 返回值:List<T>
/Set<T>
• 场景:批量处理数据(如缓存全部结果)val list = flow.toList()
-
launchIn
• 功能:在指定协程作用域中启动流收集
• 返回值:Job
• 场景:简化生命周期管理(如Android中配合lifecycleScope)flow.onEach { ... }.launchIn(viewModelScope)
-
first()
/single()
• first:取第一个元素后取消流
• single:确保流只发射一个元素(否则抛异常)
• 场景:获取单次结果(如权限请求)val result = flow.first()
相关文章:
kotlin知识体系(六) : Flow核心概念与与操作符指南
1. Flow基础概念 1.1 冷流(Cold Stream) 冷流是Flow的默认形式,其核心特点如下: • 按需触发:仅在消费者调用 collect 时开始发射数据,且每次收集都会重新执行流的逻辑(类似“单播”࿰…...
【CentOs】构建云服务器部署环境
(一) 服务器采购 2 CPU4G 内存40G 系统盘 80G 数据盘 (二) 服务器安全组和端口配置 (三) 磁盘挂载 1 登录 root 2 查看目前磁盘使用情况 df -h 3 查看磁盘挂载情况 识别哪些磁盘没挂载 fdisk -l 4 对未挂载磁盘做分区 fdisk /dev/vdb 输入m࿰…...
【AI论文】对人工智能生成文本的稳健和细粒度检测
摘要:机器生成内容的理想检测系统应该能够在任何生成器上很好地工作,因为越来越多的高级LLM每天都在出现。 现有的系统往往难以准确识别人工智能生成的短文本内容。 此外,并非所有文本都完全由人类或LLM创作,因此我们更关注部分案…...
MyFamilyTree:专业家谱族谱制作工具
MyFamilyTree 是一款专业级家谱族谱制作工具,支持 Windows 7 至 11 系统(含服务器版本)。该软件以直观的拖拽式操作为核心,支持构建多维家族树结构,并提供丰富的多媒体集成功能,便于用户记录家族成员的生…...
【统计分析120】统计分析120题分享
1-30 判断题 数学模型 指的是通过抽象、简化现实世界的某些现象,利用数学语言来描述他们的结构和行为,做出一些必要的假设,运用适当的数学工具,得到一个数学结论 数学模型:指的是通过抽象、简化现实世界的某些现象&am…...
【Windows10下PP-OCRv4部署指南】
Windows10下PP-OCRv4部署指南 一、环境准备 安装Visual Studio 2022 下载并安装 C桌面开发组件,确保支持MSVC编译环境。 配置系统环境变量,确保cl.exe等编译工具可用。 Python环境配置 推荐使用Conda创建虚拟环境: bash Co…...
Matlab PID参数整定和设计
1、内容简介 Matlab 206-PID参数整定和设计 可以交流、咨询、答疑 2、内容说明 略 某流量控制系统整定方法仿真(3) 摘 要:本次设计针对一个给定的流量控制系统进行仿真,已经确认该系统为简单控制系统,并且控制策略…...
【Linux系统】Linux基础指令(详解Linux命令行常用指令,每一个指令都有示例演示)
文章目录 一、与文件路径相关的指令0.补充知识:路径的认识1.pwd 指令2.cd 指令(含家目录的介绍) 二、创建和删除文件的指令0.补充知识:普通文件和目录文件1.touch 指令(可以修改文件的时间戳)2.mkdir 指令3…...
LLM基础-什么是Token?
LLM基础-什么是Token? 概述 Token 是大语言模型(LLM, Large Language Model)中最基本的输入单元,它是语言被模型“理解”的方式。不同于人类可以直接看懂一段自然语言文本,LLM 只能处理数字,而这些数字就…...
Few-shot medical image segmentation with high-fidelity prototypes 论文总结
题目:Few-shot medical image segmentation with high-fidelity prototypes(高精确原型) 论文:Few-shot medical image segmentation with high-fidelity prototypes - ScienceDirect 源码:https://github.com/tntek/D…...
大模型之路(day 1)
这段时间以来,全身心的投入了研究大模型,虽然还是入门,但比之前已经好了非常多了,不得不说,计算机的学习特别需要强大的自驱力和耐心,以及检索能力。知乎确实在这些知识的分享上做的比csdn好太多了 万事开…...
996引擎-拓展变量:物品变量
996引擎-拓展变量:物品变量 测试代码参考资料对于Lua来说,只有能保存数据库的变量才有意义。 至于临时变量,不像TXT那么束手束脚,通常使用Lua变量就能完成。 测试代码 -- 存:物品拓展strfunction (player)local where =...
集合框架(重点)
1. 什么是集合框架 List有序插入对象,对象可重复 Set无序插入对象,对象不可重复(重复对象插入只会算一个) Map无序插入键值对象,键只唯一,值可多样 (这里的有序无序指的是下标,可…...
IDEA在Git提交时添加.ignore忽略文件,解决为什么Git中有时候使用.gitignore也无法忽略一些文件
文章目录 一、为什么需要.gitignore文件?二、如何在IntelliJ IDEA中高效管理.gitignore文件?1:先下载这个.ignore插件2. 创建或编辑.gitignore文件3. 使用IDEA内置模板快速生成忽略规则4. 实时预览忽略效果5. 检查忽略规则是否生效6.但是一般我们更多时候…...
如何将自己封装的组件发布到npm上:详细教程
如何将自己封装的组件发布到npm上:详细教程 作为前端开发者,我们经常从npm(Node Package Manager)上下载并使用各种第三方库和组件。然而,有时候我们可能会发现自己需要的功能在npm上并不存在,或者我们希望…...
位运算,状态压缩dp(算法竞赛进阶指南学习笔记)
目录 移位运算一些位运算的操作最短 Hamilton 路径(状态压缩dp模板,位运算) 0x是十六进制常数的开头;本身是声明进制,后面是对应具体的数; 数组初始化最大值时用0x3f赋值; 移位运算 左移 把二…...
node.js|环境部署|源码编译高版本的node.js
一、 前言 本文就如何二进制部署和源码编译安装部署node.js环境做一个简单的介绍 node的版本大体是以18版本为界限,也就是说18版本之前对glibc版本没有要求,其后的版本都对glibc版本有要求,node的版本越高,glibc需要的版本也越…...
通信安全员ABC证的考试内容包括哪些?
通信安全员 ABC 证的考试内容整体上围绕通信安全相关的法律法规、安全技术、安全管理等方面展开,但在具体侧重点上有所不同,以下是详细介绍: 通信安全基础知识 通信原理:包含模拟通信和数字通信的基本原理,如调制、解…...
Oracle--SQL基本语法
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 1、SQL语句介绍 在Oracle开发中,客户端把SQL语句发送给服务器,服务器对SQL语句进行编译、执行,把执行的结果返回给…...
windows服务器及网络:论如何安装(虚拟机)
今天我要介绍的是:在Windows中对于安装系统(虚拟机的步骤以及相关的安装事宜),事不宜迟,让我们来看看系统安装(虚拟机)是怎么操作的: 对现在来说,安装电脑系统已经是非常…...
【网络篇】从零写UDP客户端/服务器:回显程序源码解析
大家好呀 我是浪前 今天讲解的是网络篇的第四章:从零写UDP客户端/服务器:回显程序源码解析 从零写UDP客户端/服务器:回显程序源码解析 UDP 协议特性核心类介绍 UDP的socket应该如何使用:1: DatagramSocket2: DatagramPacket回…...
学习笔记:黑马程序员JavaWeb开发教程(2025.3.23)
11.2 案例-文件上传-简介 文件上传的前端页面的代码需要放到springboot项目的static里面,也就是resource文件夹下面的static文件夹里面 服务端接收前端上传的数据,再服务端定义一个controller来接收数据,再controller中定义一个…...
提示词构成要素对大语言模型跨模态内容生成质量的影响
提示词构成要素对大语言模型跨模态内容生成质量的影响 提示词清晰度、具象性与质量正相关 限定指向性要素优于引导指向性要素 大语言模型生成内容保真度偏差 以讯飞星火大模型为实验平台,选取100名具备技术素养的人员,从提示词分类、构成要素和实践原则归纳出7种提示词组…...
浅聊docker的联合文件系统
前言: 在我们pull镜像的时候,就会发现一个神奇的地方,在将镜像pull到本地的时候它是分层下载的,如下图: 这时候我就有一个疑问,为什么是分层下载的?怎么和我们平时下载软件的时候不一样呢? 联…...
计算机视觉cv入门之Haarcascade的基本使用方法(人脸识别为例)
Haar CascadeXML特征分类器,是一种基于机器学习的方法,它利用了积分图像(或总面积)的概念有效地提取特征(例如,边缘、线条等)的数值。“级联分类器”即意味着不是一次就为图像中的许多特征应用数百个分类器,而是一对一地应用分类器…...
【NLP 62、实践 ⑮、基于RAG + 智谱语言模型的Dota2英雄故事与技能介绍系统】
羁绊由我而起,痛苦也由我承担 —— 25.4.14 英雄介绍文件: 通过网盘分享的文件:RAG 智谱语言模型的Dota2英雄故事与技能介绍系统 链接: https://pan.baidu.com/s/1G7Xo5TRvFl2BzUnE0NFaBA?pwd4d4j 提取码: 4d4j --来自百度网盘超级会员v3的…...
Keil MDK 编译问题:function “HAL_IncTick“ declared implicitly
问题与处理策略 问题描述 ..\..\User\stm32f1xx_it.c(141): warning: #223-D: function "HAL_IncTick" declared implicitlyHAL_IncTick(); ..\..\User\stm32f1xx_it.c: 1 warning, 0 errors问题原因 在 stm32f1xx_it.c 文件中调用了 HAL_IncTick(),但…...
OpenCV基础01-图像文件的读取与保存
介绍: OpenCV是 Open Souce C omputer V sion Library的简称。要使用OpenCV需要安装OpenCV包,使用前需要导入OpenCV模块 安装 命令 pip install opencv-python 导入 模块 import cv2 1. 图像的读取 import cv2 img cv2.imread(path, flag)这里的flag 是可选参数&…...
IP数据报
IP数据报组成 IP数据报(IP Datagram)是网络中传输数据的基本单位。 IP数据报头部 版本(Version) 4bit 告诉我们使用的是哪种IP协议。IPv4版本是“4”,IPv6版本是“6”。 头部长度(IHL,Intern…...
视频联网平台与AI识别技术在电力行业的创新应用
一、电力行业智能化转型的迫切需求 在能源革命与数字化转型的双重推动下,电力行业正面临着前所未有的智能化升级需求。随着特高压电网的大规模建设和新能源占比的不断提高,传统的电力运维管理模式已经难以满足现代电网安全、高效运行的要求。据统计&…...
Apache Parquet 文件组织结构
简要概述 Apache Parquet 是一个开源、列式存储文件格式,最初由 Twitter 与 Cloudera 联合开发,旨在提供高效的压缩与编码方案以支持大规模复杂数据的快速分析与处理。Parquet 文件采用分离式元数据设计 —— 在数据写入完成后,再追加文件级…...
深度学习方向急出成果,是先广泛调研还是边做实验边优化?
目录 有限资源下本科生快速发表深度学习顶会论文的实战策略 1.短周期内可出成果的研究路径 2.论文阅读与复现的优先顺序 3.无一对一指导时的调研与实验组织 4.成功案例:本科生顶会论文经验 5.快速上手的研究子方向推荐 大家好这里是AIWritePaper官方账号&…...
Python 深度学习实战 第11章 自然语言处理(NLP)实例
Python 深度学习实战 第11章 自然语言处理(NLP)实例 内容概要 第11章深入探讨了自然语言处理(NLP)的深度学习应用,涵盖了从文本预处理到序列到序列学习的多种技术。本章通过IMDB电影评论情感分类和英西翻译任务,详细介绍了如何使…...
9、Hooks:现代魔法咒语集——React 19 核心Hooks
一、魔法咒语的本质革新 "类组件如同古老的魔杖挥舞仪式,而Hooks是新时代的无杖施法!"霍格沃茨魔法研究院的魔杖动力学教授惊叹道。React Hooks通过函数式能量场重构了魔法运作模式,让组件能量流转如尼可勒梅的炼金术。 ——以《国…...
FutureTask底层实现
一、FutureTask的基本使用 平时一些业务需要做并行处理,正常如果你没有返回结果的需求,直接上Runnable。 很多时候咱们是需要开启一个新的线程执行任务后,给我一个返回结果。此时咱们需要使用Callable。 在使用Callable的时候,…...
深入浅出:LDAP 协议全面解析
在网络安全和系统管理的世界中,LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是一个不可忽视的核心技术。它广泛应用于身份管理、认证授权以及目录服务,尤其在企业级环境中占据重要地位。本文将从基…...
学习笔记—C++—string(练习题)
练习题 仅仅反转字母 917. 仅仅反转字母 - 力扣(LeetCode) 题目 给你一个字符串 s ,根据下述规则反转字符串: 所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。 返回反转后的 s 。…...
论文阅读:2024 arxiv DeepInception: Hypnotize Large Language Model to Be Jailbreaker
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 DeepInception: Hypnotize Large Language Model to Be Jailbreaker DeepInception:催眠大型语言模型,助你成为越狱者 https://arxiv.org/pdf/2311.0…...
OC底层原理【一】 alloc init new
OC底层原理【一】 alloc init && new 文章目录 OC底层原理【一】 alloc init && new前言allocslowpath(checkNil && !cls)) 和 fastpath(!cls->ISA()->hasCustomAWZ())!cls->ISA()->hasCustomAWZ()) obj->initInstanceIsa();将类与isa关…...
集合框架拓展--stream流的使用
Stream(JDK8新特性) 什么是Stream? 也叫stream流,是JDK8开始新增的一套API(java.util.stream.*),可以用于操作集合或数组中的数据 优势:Stream流大量地结合了Lambda的语法风格来编程ÿ…...
Beszel 轻量级服务器监控平台的详细安装步骤
什么是 Beszel Beszel 是一个轻量级的服务器监控平台,包含 Docker 统计信息、历史数据和警报功能。 它拥有友好的 Web 界面、简单的配置,并且开箱即用。它支持自动备份、多用户、OAuth 身份验证和 API 访问 https://beszel.dev/zh/guide/what-is-besz…...
Spring 微服务解决了单体架构的哪些痛点?
1. 部署困难 (Deployment Difficulty & Risk) 单体痛点: 整体部署: 对单体应用的任何微小修改(哪怕只是一行代码),都需要重新构建、测试和部署整个庞大的应用程序。部署频率低: 由于部署过程复杂且风险高,发布周期通常很长&a…...
Kotlin delay方法解析
本文记录了kotlin协程(Android)中delay方法的字节码实现,并解析了delay方法如何实现挂起操作。 一、delay方法介绍 1.1、delay方法使用举例 class TestDelay {suspend fun testDelay() {Log.d("TestDelay", "before delay")delay(1000)Log.d…...
C# 类型、存储和变量(用户定义类型)
本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 用户定义类型 除了C#提供的16种预定义类型,还可以创建自己的用户定义类型。有6种类型可以…...
C语言之高校学生信息快速查询系统的实现
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之高校学生信息快速查询系统的实现 目录 任务陈述与分析 问题陈述问题分析 数据结构设…...
Windows串口通信
Windows串口通信相比较Android串口通信,在开发上面相对方便一些。原理都是一样,需要仔细阅读厂商设备的串口通信协议。结合串口调试助手进行测试,测试通过后,编写代码实现。 比如近期就接触到了一款天平,其最大测量值为100g,测量精度0.001g。 拿到手之后我就先阅读串口通…...
从零开始用Pytorch实现LLaMA 4的混合专家(MoE)模型
近期发布的LLaMA 4模型引入了混合专家(Mixture of Experts, MoE)架构,旨在提升模型效率和性能。尽管社区对LLaMA 4的实际表现存在一些讨论,但MoE作为一种重要的模型设计范式,继Mistral等模型之后再次受到关注。 所以我…...
python3GUI--仿网课答题播放器 By:PyQt5(分享)
文章目录 一.前言二.相关知识1.PyQt52.QMediaPlayer3.QThread4.Sqlite3 二.展示1.主界面2.课程播放&问答3.字幕调整4.播放列表折叠5.添加课程 三.心得与分享1.数据本地化2.自定义组件3.系统流程图与代码量4.免责声明 四&#…...
Python基础总结(八)之循环语句
文章目录 一、for循环1.1 for循环格式1.2 for ...else1.3 for...break1.4 for...continue 二、while循环2.1 while循环格式2.2 while...break2.3 while...continue2.4 while ...else 循环语句就如其名,就是重复的执行一段代码,直到满足退出条件时&#x…...
21. git apply
基本概述 git apply 的作用是:应用补丁文件 基本用法 1.命令格式 git apply [选项] <补丁文件>2.应用补丁 git apply patchfile.patch将补丁应用到工作目录,但不会自动添加到暂存区(需手动 git add) 常用选项 1.检查…...