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

拥抱 Kotlin Flow

1. 引言

Kotlin Flow 是 Kotlin 协程生态中处理异步数据流的核心工具,它提供了一种声明式、轻量级且与协程深度集成的响应式编程模型。与传统的 RxJava 相比,Flow 更简洁、更易于维护,尤其在 Android 开发中已成为主流选择。本文将从基础概念到高级特性全面解析 Flow,结合实战案例帮助读者深入掌握这一强大工具。

2. Flow 基础概念

2.1 冷流与热流

冷流(Cold Flow):只有在被收集(collect)时才会开始执行,每个收集器独立运行。例如:

// 创建冷流,使用flow构建器,只有在被收集时才会发射数据val coldFlow = flow {emit(1) // 收集时执行emit(2) // 收集时执行}

冷流特性

按需触发:类似「点播电影」,只有订阅时才开始播放

独立副本:每个订阅者触发独立的数据流(如多次collect会重新执行flow块)

适用场景:网络请求、数据库查询等一次性任务

热流(Hot Flow):创建后立即开始发射数据,多个收集器共享数据流。例如 StateFlowSharedFlow

// 创建热流(SharedFlow),创建后立即开始发射数据val hotFlow = MutableSharedFlow<Int>()//启动协程持续发射数据(即使没有订阅者)launch {(0..2).forEach {delay(1000)hotFlow.emit(it) // 发射0,1,2(间隔1秒)}}

热流特性

主动发射:类似「直播电视」,数据持续生产

共享数据源:多个订阅者共享最新数据

适用场景:实时状态同步(如 UI 更新)、全局事件通知

冷热流对比表

特性冷流热流
数据发射时机订阅时触发创建后持续发射
订阅者关系独立执行共享数据流
典型实现flow{}asFlow()StateFlowSharedFlow
适用场景单次任务(网络请求)实时数据(传感器、WebSocket)

2.2 核心组件

生产者:通过 emit 发送数据。

操作符:对流进行转换、过滤、合并等处理。

消费者:通过 collect 等终端操作符处理数据。

数据流模型

//生产者flow {emit("数据1") // 发送数据emit("数据2")}//操作符链.map { it.toUpperCase() } // 转换操作符.filter { it.contains("2") } // 过滤操作符//消费者.collect { println(it) } // 终端操作符

3. Flow 的创建与消费

3.1 创建方式

flowOf:快速创建固定数据的流。

//创建包含1、2、3的流,底层使用channel实现val flow = flowOf(1, 2, 3)

asFlow:将集合转换为流。

//将列表转换为流,支持惰性处理val list = listOf(1, 2, 3)val flow = list.asFlow()

callbackFlow:处理回调式异步操作。

//创建callbackFlow处理网络回调val callbackFlow = callbackFlow<String> {val listener = object : Listener {override fun onData(data: String) {trySend(data) // 安全发射数据}}registerListener(listener) // 注册监听awaitClose { unregisterListener(listener) } // 关闭时取消监听}

3.2 消费方式

collect:收集所有数据。

//在协程中收集数据,每个值触发打印flow.collect { value -> println(value) }

first:获取第一个元素。

//获取第一个元素,流为空时抛出异常val firstValue = flow.first()

4. 核心操作符详解

4.1 转换操作符

map:转换元素类型。

//将整数流转换为字符串流flow.map { it.toString() }

transform:自定义转换逻辑,可发射多个值。

//对每个元素发射两次(乘2和加1)flow.transform {emit(it * 2)emit(it + 1)}

4.2 过滤操作符

filter:保留符合条件的元素。

//过滤偶数flow.filter { it % 2 == 0 }

distinctUntilChanged:去重连续重复元素。

//去除连续重复元素(如[1,1,2,2]→[1,2])flow.distinctUntilChanged()

4.3 组合操作符

zip:合并两个流。

//合并两个流,对应位置元素相加flow1.zip(flow2) { a, b -> a + b }

combine:合并多个流的最新值。

//合并温度和湿度流,计算舒适度指数combine(tempFlow, humidityFlow) { t, h ->&#x20;(t - 18) * 0.7 + (h - 60) * 0.3&#x20;}

4.4 背压处理操作符

buffer:缓存数据,避免生产者阻塞。

//设置缓冲区大小为10,溢出时挂起生产者flow.buffer(10, BufferOverflow.SUSPEND)

conflate:丢弃中间值,仅处理最新值。

//实时位置更新时跳过中间帧flow.conflate()

4.5 高级操作符

flatMapLatest:处理最新流,取消未完成操作。

//搜索输入时取消旧请求searchFlow.flatMapLatest { query ->searchApi.fetch(query) // 新请求到达时取消旧请求}

debounce:防抖处理(如搜索框输入)。

//输入停止1秒后触发搜索searchFlow.debounce(1000)

5. 背压管理

5.1 背压概念

当生产者速度超过消费者时,需通过背压策略处理数据积压。Flow 提供以下策略:

buffer:使用缓冲区存储数据。

conflate:丢弃旧值,保留最新值。

collectLatest:取消未完成的操作,处理最新值。

5.2 示例

//生产者每秒发射1个数据flow {(1..5).forEach {emit(it)delay(100) // 生产间隔100ms}}.collect {delay(200) // 消费间隔200ms,导致背压println(it)}//使用buffer优化,添加缓冲区缓解背压flow.buffer().collect { ... }

6. 错误处理

6.1 异常捕获

try-catch:在收集时捕获异常。

//收集时捕获异常try {flow.collect()} catch (e: Exception) {// 处理异常}

catch:在流中处理异常。

//流中出现异常时发射默认值flow.catch { e ->emit(-1) // 发生异常时发射默认值}.collect()

6.2 资源清理

onCompletion:流完成或取消时执行清理。

//流结束时释放资源flow.onCompletion { cause ->if (cause != null) {// 异常处理}cleanup() // 释放资源}.collect()

7. 冷热流转换

7.1 StateFlow

特点:持有当前状态,新订阅者可获取最新值。

使用示例

//创建StateFlow管理UI状态val uiState = MutableStateFlow<UIState>(Loading)//更新状态uiState.value = Success(data)

7.2 SharedFlow

特点:支持多订阅者,可配置缓存和重放。

使用示例

//创建SharedFlow发射事件val eventFlow = MutableSharedFlow<Event>()//发射事件eventFlow.emit(Event.Click)

7.3 stateInshareIn

stateIn:将冷流转为 StateFlow

//冷流转为StateFlow,初始值为0val stateFlow = flow.stateIn(scope = viewModelScope,started = SharingStarted.WhileSubscribed(),initialValue = 0)

shareIn:将冷流转为 SharedFlow

//冷流转为SharedFlow,重放1个数据val sharedFlow = flow.shareIn(scope = viewModelScope,started = SharingStarted.Eagerly,replay = 1)

8. 高级主题

8.1 协程上下文切换

flowOn:切换流的执行上下文。

//切换到IO线程执行耗时操作flow.flowOn(Dispatchers.IO)

8.2 取消与资源管理

取消流:通过协程取消。

//启动收集协程val job = launch {flow.collect()}//取消协程job.cancel()

8.3 与 Room 集成

示例:将 Room 查询结果转为流。

//Room Dao接口@Daointerface UserDao {@Query("SELECT * FROM users")fun getUsers(): Flow<List<User>> // 返回Flow}

9. 性能优化与最佳实践

9.1 避免阻塞操作

正确做法:使用 withContext 切换线程。

//在map操作中切换到IO线程flow.map {withContext(Dispatchers.IO) {// 耗时操作}}

9.2 合理使用背压策略

场景选择

buffer:适合生产者与消费者速度波动较大的场景。

conflate:适合只关心最新值的场景(如实时数据)。

9.3 测试与调试

工具推荐

Turbine:用于测试 Flow 的输出和错误。

testCoroutineDispatcher:控制协程执行。

10. Flow 与 RxJava 对比

特性FlowRxJava
协程集成原生支持需通过 RxKotlin 集成
背压自动处理需显式处理
线程管理flowOn 简洁subscribeOn/observeOn
内存管理轻量级,无额外开销可能存在内存泄漏风险

11. 实战案例

11.1 网络请求与数据缓存

//定义网络请求Flowfun fetchData(): Flow<List<Data>> = flow {val data = api.getData() // 网络请求emit(data)}.flowOn(Dispatchers.IO)//结合Room缓存val cachedDataFlow = fetchData().catch { e ->emit(roomDao.getData()) // 异常时读取缓存}.onEach { data ->roomDao.saveData(data) // 保存缓存}

11.2 实时数据更新

//ViewModel管理UI状态class MyViewModel : ViewModel() {private val _uiState = MutableStateFlow<UIState>(Loading)val uiState: StateFlow<UIState> = _uiStateinit {viewModelScope.launch {_uiState.value = Success(fetchData()) // 更新状态}}}

12. 总结

Kotlin Flow 凭借其简洁的 API、与协程的深度集成以及强大的背压处理能力,成为现代异步编程的首选工具。本文从基础概念到高级特性全面解析了 Flow,并通过实战案例展示了其在 Android 开发中的应用。合理使用 Flow 可以显著提升代码的可读性和可维护性,尤其在处理复杂数据流场景时更具优势。

相关文章:

拥抱 Kotlin Flow

1. 引言 Kotlin Flow 是 Kotlin 协程生态中处理异步数据流的核心工具&#xff0c;它提供了一种声明式、轻量级且与协程深度集成的响应式编程模型。与传统的 RxJava 相比&#xff0c;Flow 更简洁、更易于维护&#xff0c;尤其在 Android 开发中已成为主流选择。本文将从基础概念…...

winget使用

Get-Command winget winget search qq winget install Tencent.QQ.NT...

C++从入门到实战(十一)详细讲解C/C++语言中内存分布与C与C++内存管理对比

C从入门到实战&#xff08;十一&#xff09;详细讲解C/C语言中内存分布与C与C内存管理对比 前言一、C/C语言中内存分布1.内核空间2.栈3.堆4.数据段5.代码段 二、例题带练巩固C/C语言中内存分布的知识题目讲解题目答案 三、C语言动态内存分配&#xff08;知识回顾&#xff09;3.…...

flutter 专题 一百零四 Flutter环境搭建

Flutter简介 Flutter 是Google开发的一个移动跨平台&#xff08;Android 和 iOS&#xff09;的开发框架&#xff0c;使用的是 Dart 语言。和 React Native 不同的是&#xff0c;Flutter 框架并不是一个严格意义上的原生应用开发框架。Flutter 的目标是用来创建高性能、高稳定性…...

傅里叶与相位偏移

一、简介 大三的《离散数学》。。。。。 傅里叶变换是数学与工程领域的一项革命性工具&#xff0c;其核心思想是将复杂信号分解为简单正弦波的叠加&#xff0c;实现从时域&#xff08;时间维度&#xff09;到频域&#xff08;频率维度&#xff09;的转换。通过这种变换&#x…...

Godot笔记:入门索引

文章目录 前言游戏引擎软件界面关键概念GDScript导出成品创建非游戏应用后记 前言 最近对游戏引擎这块感兴趣&#xff0c;特别是因为游戏引擎自带的很多工具&#xff0c;作为图形化软件的开发应该也不错。 Godot 是一款这几年比较流行的开源游戏引擎。这里记录下入门学习使用 …...

OpenCV实战教程 第一部分:基础入门

第一部分&#xff1a;基础入门 1. OpenCV简介 什么是OpenCV及其应用领域 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库&#xff0c;于1999年由Intel公司发起&#xff0c;现在由非营利组织OpenCV.org维护。Ope…...

OpenCV 图像处理核心技术 (第二部分)

欢迎来到 OpenCV 图像处理的第二部分&#xff01;在第一部分&#xff0c;我们学习了如何加载、显示、保存图像以及访问像素等基础知识。现在&#xff0c;我们将深入探索如何利用 OpenCV 提供的强大工具来修改和分析图像。 图像处理是计算机视觉领域的基石。通过对图像进行各种…...

Git从入门到精通-第二章-工具配置

目录 命令行 安装Git 初次运行Git前的配置​ git config基本概念 常用命令 配置用户信息 配置文本编辑器 查看配置 配置别名&#xff08;简化命令&#xff09; 高级配置 换行符处理&#xff08;方便跨平台协作&#xff09; 忽略文件权限变更&#xff08;常用于团队协…...

树状结构转换工具类

项目中使用了很多树状结构&#xff0c;为了方便使用开发一个通用的工具类。 使用工具类的时候写一个类基础BaseNode&#xff0c;如果有个性化字段添加到类里面&#xff0c;然后就可以套用工具类。 工具类会将id和pid做关联返回一个树状结构的集合。 使用了hutool的工具包判空…...

C#基础简述

C#基础详解 一、C#语言概述 C#&#xff08;读作"C Sharp"&#xff09;是微软开发的面向对象的编程语言&#xff0c;运行在.NET平台上。它结合了C的强大功能和Visual Basic的简单性&#xff0c;具有以下特点&#xff1a; ​​面向对象​​&#xff1a;支持封装、继…...

AI赋能烟草工艺革命:虫情监测步入智能化时代

在当今竞争激烈且品质至上的烟草行业中&#xff0c;生产流程的每一个细微环节都关乎着企业的生死存亡与品牌的兴衰荣辱。烟草工艺部门与制丝、卷包车间作为生产链条的核心驱动&#xff0c;犹如精密仪器中的关键齿轮&#xff0c;彼此紧密咬合、协同运转&#xff0c;任何一处的小…...

小刚说C语言刷题—1462小明的游泳时间

1.题目描述 伦敦奥运会要到了&#xff0c;小明在拼命练习游泳准备参加游泳比赛。 这一天&#xff0c;小明给自己的游泳时间做了精确的计时&#xff08;本题中的计时都按 24 小时制计算&#xff09;&#xff0c;它发现自己从 a 时 b 分一直游泳到当天的 c 时 d 分。 请你帮小…...

StarRocks Lakehouse 如何重构大数据架构?

随着数据分析需求的不断演进&#xff0c;企业对数据处理架构的期望也在不断提升。在这一背景下&#xff0c;StarRocks 凭借其高性能的实时分析能力&#xff0c;正引领数据分析进入湖仓一体的新时代。 4 月 18 日&#xff0c;镜舟科技高级技术专家单菁茹做客开源中国直播栏目《…...

用TCP实现服务器与客户端的交互

引言&#xff1a; 这篇文章主要是用TCP构造的回显服务器&#xff0c;也就是客户端发什么&#xff0c;就返回什么。用实现这个过程方式来学会TCP套接字的使用。 一、TCP的特点 TCP是可靠的&#xff1a;这个需要去了解TCP的机制&#xff0c;这是一个大工程&#xff0c;博主后面写…...

用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering

用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering 文章目录 用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering摘要Abstract1. 预备知识1.1 三维的几何表示1.2 计算机中的集合…...

Vue3 Echarts 3D立方体柱状图实现教程

文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 实现一个立方体柱状图&#xff08;1&#xff09;首先实现一个基础柱状图&#xff08;2&#xff09;添加立方体棱线&#x…...

Soildworks怎样在装配体中建立局部剖视图

1思路&#xff1a;建立拉伸切除 2步骤 1-打开点线面显示按钮 2-在装配体中依据某个基准面&#xff08;例如前视基准面&#xff09;建立一个待切除的草图 3-点击顶部工具栏的装配体--->装嫩配体特征---->拉伸切除---Ok 3具体图示 1-点击&#xff0c;使其变成灰色 即…...

基于C++的IOT网关和平台5:github项目ctGateway开发指南

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 …...

虚拟机centos7安装docker

虚拟机CentOS 7上安装 Docker流程 1. 更新系统软件包 需要确保系统软件包是最新的 sudo yum -y update sudo&#xff1a;以超级用户权限执行命令。 yum&#xff1a;CentOS的包管理器工具。 -y&#xff1a;自动确认所有提示&#xff0c;直接执行。 2. 安装 Docker 依赖 在安装 …...

11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文档

Spring Boot 3.1.5 中使用 SpringDoc OpenAPI&#xff08;替代 Swagger&#xff09;生成 API 文档 1. 项目结构 假设项目名为 springboot-openapi-demo&#xff0c;以下是项目的基本结构&#xff1a; springboot-openapi-demo/ ├── src/ │ ├── main/ │ │ ├─…...

pytorch对应gpu版本是否可用判断逻辑

# gpu_is_ok.py import torchdef check_torch_gpu():# 打印PyTorch版本print(f"PyTorch version: {torch.__version__}")# 检查CUDA是否可用cuda_available torch.cuda.is_available()print(f"CUDA available: {cuda_available}")if cuda_available:# 打印…...

Kubernetes 集群概念详解

Kubernetes 集群概念详解 Kubernetes 集群是由多个计算节点组成的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用。以下是 Kubernetes 集群的核心概念和架构解析&#xff1a; 一、集群基础架构 1. 集群组成要素 graph TBMaster[控制平面] --> Node1[工作…...

BT137-ASEMI机器人功率器件专用BT137

编辑&#xff1a;LL BT137-ASEMI机器人功率器件专用BT137 型号&#xff1a;BT137 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 引脚数量&#xff1a;3 封装尺寸&#xff1a;如图 特性&#xff1a;双向可控硅 工作结温&#xff1a;-40℃~150℃…...

ArcGIS+GPT:多领域地理分析与决策新方案

技术点目录 AI大模型应用ArcGIS工作流程及功能prompt的使用技巧AI助力工作流程AI助力数据读取AI助力数据编辑与处理AI助力空间分析AI助力遥感分析AI助力二次开发AI助力科研绘图ArcGISAI综合应用了解更多 ——————————————————————————————————…...

鸿蒙文件上传-从前端到后端详解,对比jq请求和鸿蒙arkts请求区别,对比new FormData()和鸿蒙arktsrequest.uploadFile

需要权限&#xff1a;ohos.permission.INTERNET 1.nodejs自定义书写上传后端接口 传输过来的数据放在files?.image下 router.post(/upload,(req, res) > {var form new multiparty.Form();form.uploadDirpublic/images/uploads; //上传图片保存的地址(目录必须存在)fo…...

【DBeaver】如何连接MongoDB

MongoDB驱动 在 DBeaver 社区版是没有的&#xff0c;得自己下载 一、下载mongo-jdbc-standalone.jar 二、在工具栏找到数据库&#xff0c;选择驱动管理器 三、在驱动管理器点击新建 四、选择库&#xff0c;添加mongo-jdbc-standalone.jar;然后点击找到类 五、选择设置&#x…...

Unity 粒子同步,FishNet

Github的工程 同步画面 使用FishNet插件同步&#xff0c;可使用这个选项来克隆第二个项目进行测试...

自然语言处理之命名实体识别:Bi-LSTM-CRF模型的评估与性能分析

命名实体识别(Named Entity Recognition, NER)是自然语言处理(NLP)的核心任务之一,旨在从文本中识别出具有特定意义的实体(如人名、地名、机构名等),并为其分类。随着深度学习的发展,**Bi-LSTM-CRF**(双向长短期记忆网络结合条件随机场)模型因其强大的序列建模能力成…...

【SpringBoot】基于mybatisPlus的博客系统

1.实现用户登录 在之前的项目登录中&#xff0c;我使用的是Session传递用户信息实现校验登录 现在学习了Jwt令牌技术后我尝试用Jwt来完成校验工作 Jwt令牌 令牌一词在网络编程一节我就有所耳闻&#xff0c;现在又拾了起来。 这里讲应用&#xff1a;令牌也就用于身份标识&a…...

[Android]任务列表中有两个相机图标

现象&#xff1a; 修改AndroidManifest.xml <activityandroid:name"com.android.camera.PermissionsActivity"android:label"string/app_name"android:launchMode"singleTop"android:configChanges"orientation|screenSize|keyboardH…...

VINS-FUSION:配置参数说明与配置自己的参数

文章目录 📚简介📍配置文件说明📷相机配置参数🔧设备参数🎯配置自己的参数📷相机参数🔧设备参数📚简介 VINS-Fusion 是一个基于优化的多传感器状态估计器,实现了视觉惯性里程计(VIO)和视觉惯性全球导航卫星系统(VI-GNSS)融合。 📍配置文件说明 VINS-Fus…...

Polars: 新一代高性能数据处理库

<------最重要的是订阅“鲁班模锤”------> 在数据科学和数据分析领域&#xff0c;性能和效率一直是从业者关注的焦点。随着数据量的爆炸式增长&#xff0c;传统的数据处理工具如pandas在处理大规模数据时逐渐显露出其局限性。在这样的背景下&#xff0c;一个名为Polars…...

大屏/门户页面兼容各种分辨率或电脑缩放

需求要求: 需要支持缩放功能(缩放后 页面各元素模块正常展示)、 需要适配各种分辨率(初始加载不应出现横向滚动条) 选择的实现方案 利用 zoom 或者 transform 来缩放兼容页面样式&#xff0c;不动业务模块代码 const isMobile /iPhone|iPad|iPod|Android|Harmony/i.test(navi…...

自定义项目中导入文件import顺序

项目中import 顺序 分类顺序 可以根据模块或文件的功能、类型等进行分类&#xff0c;比如将所有的组件放在一起、工具函数放在一起等。这样的组织方式更有利于对项目结构和代码逻辑的理解&#xff0c;当需要查找某一类功能的代码时&#xff0c;可以快速定位到相应的 import 区…...

Git 本地提交撤销

引言 在 Git 版本控制系统中&#xff0c;偶尔会遇到需要撤销本地提交的情况。本文将详细介绍如何优雅地处理这种情况&#xff0c;帮助您在不慌乱的情况下恢复错误提交。 撤销本地提交的主要方法 当您意外提交了错误文件到 Git 仓库&#xff0c;但尚未推送到远程服务器时&…...

k8s术语之Replication Controller

Replication Controller 在kubernetes中简称RC,它其实是定义了一个期望的场景&#xff0c;即声明某种Pod的副本数量在任意时刻都符合某个预期值&#xff0c;包括一下几个值&#xff1a; 1.Pod期待的副本数&#xff08;replicas) 2.用于筛选目标Pod的Lable Selector 3.当…...

AI驱动视频批量智能混剪软件生产技术实践

一、引言&#xff1a;短视频工业化生产的技术革新 在电商带货、知识分享等领域&#xff0c;高效产出差异化视频内容成为核心竞争力。本文结合AI技术与工程实践&#xff0c;解析如何通过智能素材处理、参数化合成引擎、多维度质量控制构建全自动视频生产流水线&#xff0c;实现…...

SPL 量化 回测

回测是一种评估交易策略的通用方法。它通过计算策略在历史数据上的表现来评估交易策略的可行性。如果回测结果良好&#xff0c;交易者和分析师可能会有信心在未来继续使用该策略。 1. 回测脚本 首先要编写回测脚本&#xff0c;将回测脚本保存为 backtest.splx。 脚本代码如下…...

2025年“深圳杯”数学建模挑战赛A题-芯片热弹性物理参数估计

芯片热弹性物理参数估计 小驴数模 当今时代&#xff0c;芯片无疑是现代社会发展的 “核心引擎”。它深度嵌入智能手机&#xff0c;实现全球即时通讯&#xff1b;助力汽车智能驾驶&#xff0c;精准导航、自动操控&#xff1b;赋能工业自动化生产线&#xff0c;高效运转。但随着…...

前端笔记-Element-Plus

结束了vue的基础学习&#xff0c;现在进一步学习组件 Element-Plus部分学习目标&#xff1a; Element Plus1、查阅官方文档指南2、学习常用组件的使用方法3、Table、Pagination、Form4、Input、Input Number、Switch、Select、Date Picker、Button5、Message、MessageBox、N…...

vue3封装全局方法

场景&#xff1a;各个模块详情中存在附件列表数据&#xff0c;需要再每个中添加一个预览附件的方法&#xff0c;是后期提出的需求&#xff0c;所以要在每个模块中进行添加&#xff0c;就去将预览方法封装一下。 将公共方法封装在utils下 utils/filePreview.ts import router…...

Django 学习指南:从入门到精通(大体流程)

想要快速掌握 Django 开发技能吗&#xff1f;按照以下学习流程&#xff0c;带你从零基础成长为独立开发 Web 应用的高手。 一、准备工作&#xff1a;打下坚实基础 在开启 Django 之旅前&#xff0c;先确保你已掌握以下 Python 基础知识&#xff1a; 数据类型&#xff1a;熟悉数…...

Java对集合进行操作,赋值新字段

1、方法一&#xff1a;增强for循环 List<Refund> list refundService.selectRefundList(queryParam); for (Refund refund : list) {refund.setPayWay(refund.getPaymentMethod()); // 将支付方式赋值给付款方式 }在 Java 中&#xff0c;当你使用 for 循环遍历 List<…...

【网工第6版】第6章 网络安全③

目录 ■ 虚拟专用网VPN ◆虚拟专用网基础 ◆VPN分类 ▲根据应用场景不同分类 ▲根据VPN技术实现的网络层次分类 ◎ 二层隧道协议&#xff1a;L2TP和PPTP ◎ 网络层隧道协议&#xff1a;IPSec和GRE ※ IPSec IPSec基础 IPSec原理 IPSec两种封装模式 ※ GRE ■ 应用…...

20250430在ubuntu14.04.6系统上查看系统实时网速

rootrootubuntu:~$ sudo apt-get install iftop 【不需要root权限】 rootrootubuntu:~$ sudo apt-get install nload rootrootubuntu:~$ sudo apt-get install vnstat 【失败】 rootrootubuntu:~$ sudo apt-get install speedtest-cli rootrootubuntu:~$ sudo apt-get install …...

远程 Debugger 多用户环境下的用户隔离实践

远程 Debugger 多用户环境下的用户隔离实践 在现代分布式开发和云原生环境下&#xff0c;远程 Debugger 的应用愈发普遍。然而&#xff0c;随着多人协作和多租户场景的出现&#xff0c;**远程 Debugger 的“用户隔离”**变得至关重要。只有实现了良好的用户隔离&#xff0c;才…...

Neo4j多关系或多路径

目录 一、双向关系 1.创建2个节点间的双向关系 2.创建多个路径的节点&#xff0c;双向关系 3.查询带有方向性的关系 4.查询路径上的多个关系 5.查询出a到b的最短距离 6.查询特定长度的路径 二、将之前的关系清空下&#xff0c;如图所示&#xff0c;在操作一次 1.查询出…...

Locate 3D:Meta出品自监督学习3D定位方法

标题&#xff1a; Locate 3D: Real-World Object Localization via Self-Supervised Learning in 3D 摘要&#xff1a; 我们提出了 Locate 3D&#xff0c;这是一种可根据指代表达&#xff08;如“沙发和灯之间的小咖啡桌”&#xff09;在三维场景中定位物体的模型。Locate 3…...

Copilot for Excel 一键词云分析与情绪分析

在Excel中使用copilot对数据进行高级分析&#xff0c;我们已经领略过copilot的强悍能力&#xff1a; 零代码、超越DeepSeek&#xff1a;Excel高级数据分析&#xff0c;copilot加持、Python助力 Python in Excel高级分析&#xff1a;一键RFM分析 然而&#xff0c;很多时候我们…...