Kotlin 中 集合 Collection 的扩展方法完全指南
Kotlin 中 Collection 的扩展方法完全指南
“代码是最美的诗篇”——本文将带你进入 Kotlin 集合扩展函数的世界,帮助你写出既高效又优雅的代码 🚀
一、引言 🤔
在 Android 开发中,集合(Collection)的操作无处不在。无论是处理网络请求返回的数据、解析 JSON 结构,还是进行数据统计与分析,Kotlin 的丰富 API 都使得我们的代码更简洁明了。而扩展函数正是 Kotlin 的一大亮点,让我们可以在不修改原有类定义的前提下,方便地扩展功能。
本文将详细讲解 Kotlin 集合扩展函数的原理、常用方法、最佳实践、性能优化,以及项目实战案例,希望能为开发者在日常工作中提供切实的帮助。😊
二、Kotlin 中 Collection 的基本类型概览 🧺
在开始深入扩展函数之前,我们先来回顾一下 Kotlin 中最常见的集合类型。
1. 不可变集合 vs. 可变集合
Kotlin 默认提供了不可变集合如 List
、Set
、Map
,这种设计有助于提高代码的稳定性和线程安全性。如果需要对集合进行修改,则需要使用 MutableList
、MutableSet
和 MutableMap
等对应的可变类型。
示例代码:
val immutableList = listOf("A", "B", "C")
val mutableList = mutableListOf("A", "B", "C")
mutableList.add("D")
2. 创建集合的技巧
- 使用
arrayOf
、listOf
、setOf
与mapOf
快速创建集合 - 利用 Kotlin 的构造函数和伴生对象可以定制初始化逻辑
- 借助 DSL(领域特定语言)模式,可以实现更直观的集合构造
三、扩展函数简介 🔧
1. 扩展函数的概念
扩展函数是一种在不改变现有类定义的前提下,为类增加新功能的技术。它的语法简单,在使用时和普通的成员函数调用无异,但底层实际上是静态解析的。这种方法可以帮助我们解耦代码,不需要继承就能增加新功能。
示例: 为 List 增加一个求中位数的扩展方法
fun List<Int>.median(): Double {if (this.isEmpty()) throw NoSuchElementException("List is empty")val sortedList = this.sorted()return if (sortedList.size % 2 == 1) {sortedList[sortedList.size / 2].toDouble()} else {val mid1 = sortedList[sortedList.size / 2 - 1]val mid2 = sortedList[sortedList.size / 2](mid1 + mid2) / 2.0}
}
2. 扩展函数与继承、工具类的比较
- 继承:扩展函数无需继承就能为一个类增加功能,且不改变继承体系。
- 工具类:传统工具类通过静态方法扩展功能,但扩展函数可以让调用方式更接近面向对象编程,增强代码可读性。
3. 编译原理简析
扩展函数在编译期被静态解析为类的普通方法调用,并不会改变类本身的字节码结构。因此,它们不存在运行时的多态性,但可以帮助开发者写出更简洁的代码。
四、集合常用扩展函数大全 🧠
在 Kotlin 中,针对集合的扩展函数十分丰富,本文将按照功能分类详细介绍各类扩展函数,同时提供示例代码和使用建议。
4.1 遍历类函数 👀
4.1.1 forEach
与 forEachIndexed
- forEach:对集合中每个元素执行特定操作,非常适用于简化循环写法。
- forEachIndexed:在遍历时提供元素索引,便于需要同时处理索引和数据的场景。
代码示例:
val names = listOf("Alice", "Bob", "Catherine")
names.forEach { name ->println("Hello, $name!")
}names.forEachIndexed { index, name ->println("Element at index $index is $name")
}
4.2 过滤与查找 🕵️♂️
4.2.1 常见方法介绍
- filter/filterNot:根据指定条件过滤集合中的元素。
- takeWhile/dropWhile:从集合中取出或忽略满足某一条件的一段数据。
- find/firstOrNull:查找集合中第一个匹配条件的元素,返回 null 如果没有找到。
代码示例:
val numbers = listOf(1, 2, 3, 4, 5, 6)
val evenNumbers = numbers.filter { it % 2 == 0 } // 结果:[2, 4, 6]
val oddNumbers = numbers.filterNot { it % 2 == 0 } // 结果:[1, 3, 5]val firstLargeThanThree = numbers.firstOrNull { it > 3 } // 结果:4
4.3 转换与映射 🎭
4.3.1 map、mapIndexed 与 flatMap
- map/mapIndexed:将集合中每个元素映射为另一个值,可传入索引进行复杂转换。
- flatMap:将每个元素映射为集合,再将所有子集合“拉平”为一个集合。
- groupBy/associateBy:对数据进行分组或通过指定的字段生成 Map。
代码示例:
val numbers = listOf(1, 2, 3, 4)
val squares = numbers.map { it * it }
println(squares) // 结果:[1, 4, 9, 16]val words = listOf("apple", "banana", "cherry")
val wordLengthMap = words.associateBy(keySelector = { it }, valueTransform = { it.length })
println(wordLengthMap) // 结果:{"apple": 5, "banana": 6, "cherry": 6}val nestedList = listOf(listOf(1,2), listOf(3,4))
val flatList = nestedList.flatMap { it }
println(flatList) // 结果:[1, 2, 3, 4]
4.4 排序 🧮
4.4.1 排序相关扩展函数
- sortedBy/sortedWith:支持根据特定规则排序,后者允许传入自定义的 Comparator。
- reversed/shuffled:倒序排列集合、随机打乱集合顺序。
代码示例:
val unsorted = listOf(3, 1, 4, 2)
val sorted = unsorted.sortedBy { it }
println(sorted) // 结果:[1, 2, 3, 4]val reversed = sorted.reversed()
println(reversed) // 结果:[4, 3, 2, 1]val shuffled = sorted.shuffled()
println(shuffled) // 输出可能:[2, 1, 4, 3](每次结果不同)
4.5 聚合操作 📊
4.5.1 常用聚合函数介绍
- fold/reduce:对集合中的元素做累加或累乘等操作,
fold
允许指定初始值。 - count/sumBy/average/maxByOrNull:统计、求和、求平均值和最大元素等。
代码示例:
val nums = listOf(1, 2, 3, 4, 5)
val sum = nums.fold(0) { total, next -> total + next }
println("Sum = $sum") // 结果:15val maxValue = nums.maxByOrNull { it }
println("Max value = $maxValue") // 结果:5
4.6 集合操作与组合 🧬
4.6.1 组合操作函数
- plus/minus:提供简单的集合合并与差集运算。
- union/intersect:分别用于求并集与交集。
- distinctBy/zip/chunked:用于去重、合并集合以及将集合按指定长度拆分为子集合。
代码示例:
val listA = listOf("a", "b", "c")
val listB = listOf("b", "c", "d")
val unionList = listA union listB
println(unionList) // 结果:["a", "b", "c", "d"]val zipped = listA.zip(listB) // 合并时取最短集合长度
println(zipped) // 结果:[("a", "b"), ("b", "c"), ("c", "d")]val chunkedList = listA.chunked(2)
println(chunkedList) // 结果:[["a", "b"], ["c"]]
4.7 其他常用小技巧 ✨
4.7.1 补充常用扩展方法
- ifEmpty/orEmpty:在集合为空时返回默认集合。
- getOrElse/getOrNull:安全地获取集合中指定索引元素。
- requireNoNulls:验证集合中无空值,确保数据完整性。
代码示例:
val emptyList: List<Int>? = listOf()
println(emptyList.ifEmpty { listOf(0) }) // 当为空时返回默认列表val element = listOf("Kotlin").getOrElse(1) { "Default" }
println(element) // 索引 1 越界,输出 "Default"val listWithNulls = listOf("A", null, "C")
println(listWithNulls.requireNoNulls()) // 运行时抛出异常,因为集合包含 null
五、实用技巧与最佳实践 🧑💻
在实际项目中,合理使用扩展函数能大大提升代码的可读性和复用性。下面我们总结了一些实用技巧和最佳实践:
1. 链式调用与代码简化
- 多层链式调用:可以将多个操作连缀调用,减少中间变量的使用,使代码更简洁。例如:
val result = items.filter { it.active }.map { it.value }.sorted()
- 注意代码可读性:链式调用虽然简洁,但在超过三层以上时建议适当拆分以便后期维护 🔨
2. 高阶函数的优势与陷阱
- 优势:高阶函数让我们可以将业务逻辑封装为可复用的代码块,充分利用 Lambda 表达式减少样板代码。
- 陷阱:过多的 Lambda 嵌套会使代码逻辑不易追踪,同时滥用扩展函数可能导致阅读困难。因此,务必在必要时添加必要的注释与合理的函数命名。
3. 扩展函数的复用与团队规范
- 代码复用:将常用的集合操作封装成通用扩展函数,放置于项目公共库中。
- 团队规范:为团队制定统一的扩展函数命名和使用规范,保证代码风格一致,便于交叉维护。
4. 示例最佳实践总结
- 示例 1: 根据条件过滤用户列表,再转为 Map 格式:
data class User(val id: Int, val name: String, val age: Int)val users = listOf(User(1, "Alice", 25),User(2, "Bob", 30),User(3, "Charlie", 22) )val adultUsers = users.filter { it.age >= 25 }.associateBy { it.id } println(adultUsers)
- 示例 2: 自定义扩展函数处理集合内数据转换:
fun <T> List<T>.convert(transform: (T) -> T): List<T> {return this.map { transform(it) } }val incremented = listOf(1, 2, 3).convert { it + 1 } println(incremented) // 输出:[2, 3, 4]
六、性能分析与优化建议 🚀
在实际开发中,高频调用的扩展函数若未充分注意其性能代价,可能导致性能瓶颈。以下是一些性能优化技巧:
1. 注意函数调用顺序
- 顺序优化:当涉及到多重 filter、map 等操作时,建议调整顺序以减少中间集合的创建。例如:
同时要比较// 推荐写法:先过滤,再映射 val optimized = list.filter { it > 10 }.map { it * 2 }
map -> filter
与filter -> map
的执行效率差异。
2. 惰性序列 asSequence()
的应用
- 何时使用:对于大量数据处理,使用
asSequence()
将集合转为序列,在链式调用时采用惰性计算,能有效减少临时对象的创建:val lazyResult = list.asSequence().filter { it % 2 == 0 }.map { it * it }.toList()
- 注意事项:虽然惰性序列在数据量大时具有优势,但在数据较小时直接使用集合操作可能更直观,因序列本身也有额外开销。
3. 多层嵌套与内联函数
- 内联函数:对于高频调用的扩展函数,考虑用
inline
提升性能。 - 跨 inline 控制:理解
noinline
与crossinline
的用法,防止不必要的内联代码膨胀。
4. 使用性能调试工具
- 工具推荐:利用 Android Profiler、Benchmark 等工具,对关键集合操作进行性能测试,找出性能瓶颈,再做有针对性的优化 🔍
- 案例分析:记录多种集合操作的执行时间,比较不同方案的优劣,为实际项目提供数据支撑。
七、进阶话题 🌌
在掌握基本扩展函数后,我们还可以探索更多高级特性:
1. 自定义集合扩展函数的正确姿势
- 封装复杂逻辑:如自定义分页处理、数据分组统计等扩展函数,有助于提高代码抽象层次。
- 示例: 定义一个根据指定条件分组后求和的扩展函数:
使用此函数可以有效减少重复代码,提高逻辑复用率。fun <T> List<T>.groupSum(keySelector: (T) -> String, valueSelector: (T) -> Int): Map<String, Int> {return this.groupBy(keySelector).mapValues { entry -> entry.value.sumOf { valueSelector(it) } } }
2. 内联(inline)、非内联(noinline)、交叉内联(crossinline)的场景
- inline:适用于频繁调用的小函数,可减少 Lambda 参数调用带来的性能损耗。
- noinline/crossinline:在必要时保护 Lambda 表达式的不变性,防止内联带来的副作用。
- 案例解析:在自定义扩展函数中合理使用这些关键字,优化性能同时保持代码清晰。
3. 与 Flow、LiveData 的结合
- 扩展函数与数据流:将集合扩展函数与 Kotlin Flow 结合,实现响应式数据处理。
- 示例:通过扩展函数将 List 转为 Flow 进行异步数据变换:
此种方式可以结合 Android 架构组件,构建高效的数据流处理流程。import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.mapval flowResult = listOf(1, 2, 3).asFlow().map { it * 2 }// 后续可以使用 collect 进行数据消费
八、项目实战案例演示 📱
通过实际案例,我们可以更直观地感受到 Kotlin 集合扩展函数的威力:
案例 1:复杂 JSON 数据解析
- 背景介绍:在实际项目中,我们常常需要处理后端返回的复杂 JSON 数据,如用户信息、订单列表等。
- 解决方案:利用扩展函数将 JSON 数据转换为实体模型,再结合集合函数进行数据筛选和组合。
代码示例:
// 假设有一个 JSON 字符串解析函数(使用 Gson 或 Moshi 等库)
fun String.toUserList(): List<User> {// JSON 解析逻辑(略)return listOf()
}data class User(val id: Int, val name: String, val isActive: Boolean)// 使用扩展函数进行数据处理
val jsonData = /* 从网络获取的 JSON 数据 */
val userList = jsonData.toUserList()
val activeUsers = userList.filter { it.isActive }
println("Active users: $activeUsers")
案例 2:在 RecyclerView Adapter 中处理数据列表更新
- 问题描述:在 Adapter 中,每次数据更新都需要计算 diff 并刷新 UI。
- 解决方案:利用集合扩展函数优化数据比较过程,减少重复数据的遍历,并可结合 DiffUtil 实现高效刷新。
- 实现思路:用扩展函数将新旧列表中的各个数据元素映射为唯一标识,然后通过比较判定是否需要刷新对应项。
案例 3:构建 DSL 风格的数据处理模块
- 背景介绍:在某些业务场景中,希望提供类似 SQL 的数据处理接口。
- 方案:利用 Kotlin 扩展函数,构建自定义 DSL,实现对集合数据的过滤、排序、分组等操作。
- 示例代码:
class Query<T>(private val source: List<T>) {private var predicate: ((T) -> Boolean)? = nullfun where(condition: (T) -> Boolean): Query<T> {predicate = conditionreturn this}fun execute(): List<T> {return predicate?.let { source.filter(it) } ?: source}
}fun <T> List<T>.query(init: Query<T>.() -> Unit): List<T> {return Query(this).apply(init).execute()
}// 使用 DSL 查询数据
val result = listOf(1, 2, 3, 4, 5).query {where { it > 3 }
}
println(result) // 输出:[4, 5]
九、结语 💬
本文详细介绍了 Kotlin 中 Collection 扩展函数的使用方法,从基本概念到实际项目应用,再到性能分析与进阶话题,力求帮助读者全方位了解扩展函数带来的优势和潜在问题。掌握这些知识不仅能让你的代码更优雅,同时也能提高开发效率。希望大家能在项目中不断实践,探索更多适合自身项目的优化方案,写出更加高效、简洁的代码。🔥
附录:常用扩展函数速查表
函数名称 | 功能描述 | 适用场景 |
---|---|---|
forEach | 遍历集合中的每个元素 | 需要对每个元素执行操作时 |
forEachIndexed | 遍历并获取元素及其索引 | 需要索引信息进行关联处理时 |
filter/filterNot | 条件过滤集合元素 | 根据条件筛选符合要求的元素时 |
map/mapIndexed | 转换集合中每个元素 | 需要将每个元素映射到另一种数据结构时 |
flatMap | 扁平化集合嵌套结构 | 每个元素转换为集合后再合并输出 |
sortedBy/sortedWith | 排序集合,支持自定义规则 | 数据有序输出或显示时 |
fold/reduce | 对集合做累计计算 | 数据聚合、统计、求和等场景 |
groupBy/associateBy | 分组或转换为 Map 格式 | 数据需要分类汇总展示时 |
union/intersect | 求集合的并集与交集 | 数据合并或比较时 |
ifEmpty/orEmpty | 为空时返回默认值 | 处理可能出现空集合情况时 |
相关文章:
Kotlin 中 集合 Collection 的扩展方法完全指南
Kotlin 中 Collection 的扩展方法完全指南 “代码是最美的诗篇”——本文将带你进入 Kotlin 集合扩展函数的世界,帮助你写出既高效又优雅的代码 🚀 一、引言 🤔 在 Android 开发中,集合(Collection)的操作…...
STM32F407使用ESP8266连接阿里云并上传数据
文章目录 前言一、ESP01S介绍1.ESP01S2.MQTT固件烧录3.WIFI连接 二、阿里云平台介绍1.创建产品及添加设备2.连接云平台 三、数据上报四、命令下发五、完整工程 前言 在实现OTA功能我们必须学会如何连接云平台,本文会仔细介绍使用STM32F407和ESP8266连接阿里云平台&…...
TorchServe部署模型-index_to_name.json
在TorchServe部署模型时,若要将模型输出结果映射到指定标签(如分类任务的类别名称),需通过index_to_name.json文件定义索引与标签的映射关系,并在打包模型时将其作为额外文件包含。以下是完整流程和命令示例࿱…...
每日一题——BMN3 小红炸砖块
“落下”操作只会对y轴有影响,所以注意y轴的变化即可 只要给出的坐标有砖块,就遍历查找他的上面是否有砖块,每一层都是这样,直到到没有砖块的那一层; 注意:定义矩阵时要注意,给出的坐标都是大…...
AWS服务器 磁盘空间升级到100G后,怎么使其生效?
在AWS(Amazon Web Services)上扩展EBS(Elastic Block Store)卷的大小后,服务器操作系统并不会自动识别新增的空间。要使操作系统识别并使用新增的磁盘空间,您需要进行一些额外的步骤。以下是详细的指导和说…...
AWS弹性容器服务(AWS Elastic Container Service,ECS)概述
李升伟 编译 标签:AWS | ECS | 容器 | Docker AWS弹性容器服务(AWS Elastic Container Service,ECS)简介 AWS弹性容器服务(ECS)是一项完全托管的容器编排服务,支持运行、管理和扩展容器化应用…...
【消息队列kafka_中间件】一、快速入门分布式消息队列
在当今大数据和分布式系统盛行的时代,消息队列作为一种关键的中间件技术,发挥着举足轻重的作用。其中,Apache Kafka 以其卓越的性能、高可扩展性和强大的功能,成为众多企业构建分布式应用的首选消息队列解决方案。本篇文章将带你深…...
【Axure元件分享】移动端滑动拨盘地区级联选择器
在移动端产品设计中,地区级联选择器(省/市/区)是用户信息录入场景的核心组件,尤其在电商收货地址、政务信息填报等高频业务中直接影响表单转化率。本文将介绍一款基于Axure的三级动态联动机型地区选择器,通过仿真级联滚…...
宁德时代25年校招演绎数字推理SHL测评题库题型及真题分析
非常感谢您对宁德时代的关注。祝贺您通过宁德时代校园招聘的专业面试环节,现邀请您参与完成以下测评。本轮共两份测评,每份测评对您的最终结果都非常重要,请务必在收到测评后48小时内完成!本测评需要进行远程监考,如果您无法或不愿…...
Python-Django+vue宠物服务管理系统功能说明
❥(^_-) 上千个精美定制模板,各类成品Java、Python、PHP、Android毕设项目,欢迎咨询。 ❥(^_-) 程序开发、技术解答、代码讲解、文档,💖文末获取源码+数据库+文档💖 💖软件下载 | 实战案例 💖文章底部二维码,可以联系获取软件下载链接,及项目演示视频。 本项目…...
洛谷普及B3691 [语言月赛202212] 狠狠地切割(Easy Version)
题目:[语言月赛202212] 狠狠地切割(Easy Version) 题号:B3691 难度:普及一 末尾包含对二分法优化的详细解释 题目分析 最后一句应该是本题的考查关键,关于筛选算法的时间优化, 但从功能理论上,我找到了…...
FPGA_BD Block Design学习(一)
PS端开发流程详细步骤 1.第一步:打开Vivado软件,创建或打开一个工程。 2.第二步:在Block Design中添加arm核心,并将其配置为IP核。 3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。 …...
Collection vs Collections:核心区别与面试指南
Collection vs Collections:核心区别与面试指南 一、本质区别(核心记忆点) 维度CollectionCollections身份集合框架的根接口操作集合的工具类包位置java.utiljava.util是否可实例化❌ 接口✅ 类(但构造器私有,不可实…...
sqlite3基本语句
创建表 CREATE TABLE student ( id INTEGER PRIMARY KEY, -- 学号,主键 name TEXT NOT NULL, -- 姓名,不能为空 age INTEGER, -- 年龄 gender TEXT -- 性别 ); SQLite常用数据类型 主键 …...
jupyter notebook 显示conda虚拟环境
使用 nb_conda_kernels 安装 nb_conda_kernels:这个包可以自动从你的 Conda 环境中发现并列出内核。 conda activate base # 确保你在 base 环境或任何其他环境中安装 conda install nb_conda_kernels显示jupyternotebook当前所在的位置。...
华为海思IC前端中后端(COTXPU)岗位笔试机考题
近期华为海思即将开始IC设计实现实习岗位机考。小编今天给大家分享下华为海思相关机考题目。 华为海思2025届校招笔试面试经验分享 每年IC秋招笔试其实也是从题库中随机抽出一些题。 华为海思2025届校招笔试面试经验分享华为海思机考主要分三个方向,分别是物理方向…...
HarmonyOS NEXT 实现滑动拼图验证码功能
大家好,我是 V 哥。 在 Gitee 上看到一个用 Java 实现的 HarmonyOS 滑动拼图验证码功能,已经太老了,鸿蒙开发推荐使用 ArkTS 语言,V 哥来改造一下。 以下是基于 ArkTS 的实现方案。由于鸿蒙系统的特性差异,这里提供核…...
【XML基础-1】深入理解XML:介绍、语法规则与实际应用
XML(可扩展标记语言)作为数据表示和交换的标准格式,自1998年问世以来已成为现代计算领域不可或缺的一部分。本文将全面介绍XML的基础概念、详细语法规则以及它在各领域中的实际应用。 1. 什么是XML? XML(eXtensible …...
STM32 HAL库扩大USB CDC的输入缓冲区
STM32 HAL库,使用USB, 扩大输入暂存区的方法 使用STM32的USB通讯CubeMX建立配置Serial Wire时钟配置USB配置时钟频率设置代码编写运行效果总结使用STM32的USB通讯 STM32可以不用使用串口转换直接和USB通讯。这给串口调试提供了极大的方便。编程,我使用了STM32CubeIDE编程。这…...
迭代器模式深度解析与实战案例
一、模式定义 迭代器模式(Iterator Pattern) 是一种行为设计模式,提供一种方法顺序访问聚合对象的元素,无需暴露其底层表示。核心思想是将遍历逻辑从聚合对象中分离,实现 遍历与存储的解耦。 二、核心组件 组件作用…...
Kotlin协程实用模版合集
目录 ✅ Kotlin 协程实用模板合集(适合 Android 项目) 📦 1. 基础挂起函数封装(Repository 层) ⚙️ 2. ViewModel 中使用协程 状态处理 ⏱️ 3. 带超时控制的挂起操作 🤝 4. 并发请求合并࿰…...
基于Flask的Windows事件ID查询系统开发实践
基于Flask的Windows事件ID查询系统开发实践 一、项目背景与功能概述 Windows操作系统的事件日志系统记录了数百种不同的事件ID,每个ID对应特定的系统事件。本文介绍如何构建一个基于Web的事件ID查询系统,主要实现以下功能: 数据可视化展示…...
机器人编程基础---C语言中的运算符
C语言中的运算符 算术运算符关系运算符逻辑运算符位运算符C语言提供了多种运算符来执行不同的操作。 算术运算符 + 加法- 减法* 乘法/ 除法% 取模(求余)++ 自增-- 自减int a = 10, b = 5; int sum = a + b;...
设计模式之迭代器模式:遍历的艺术与实现
引言 迭代器模式(Iterator Pattern)是一种行为型设计模式,它提供了一种顺序访问聚合对象中各个元素的方法,而又不暴露其底层实现。迭代器模式将遍历逻辑与聚合对象解耦,使得我们可以用统一的方式处理不同的集合结构。…...
React七案例中
代码下载 地图找房模块 顶部导航栏 封装NavHeader组件实现城市选择,地图找房页面的复用,在 components 目录中创建组件 NavHeader,把之前城市列表写过的样式复制到 NavHeader.scss 下,在该组件中封装 antd-mobile 组件库中的 N…...
消息中间件篇——RabbitMQ,Kafka
RabbitMQ 如何保证消息不丢失? 生产者确认机制 消息持久化 消费者确认机制 RabbitMQ如何保证消息不丢失? RabbitMQ的重复消费问题如何解决? RabbitMQ中死信交换机(RabbitMQ延迟队列有了解过吗?) 延迟队列…...
HOW - 实现 useClickOutside 或者 useClickAway
场景 在开发过程中经常遇到需要点击除某div范围之外的区域触发回调:比如点击 dialog 外部区域关闭。 手动实现 import { useEffect } from "react"/*** A custom hook to detect clicks outside a specified element.* param ref - A React ref object…...
青少年编程考试 CCF GESP Python七级认证真题 2025年3月
Python 七级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 B C A B B A A B C A B B A B A 1 单选题(每题 2 分,共 30 分) 第 1 题 下列哪个选项是python中的关键字? A. function B. class C. method D. object…...
兆讯MH2103系列pin to pin替代STM32F103,并且性能超越
MH2103 是一款高性能的 32 位微控制器,由兆讯恒达推出,主要用于替代 STM32F103 系列产品。以下是关于 MH2103 芯片的详细介绍: 技术规格 内核与主频: 采用高性能 32 位 Cortex-M3 内核,最高工作频率可达 216 MHz。支…...
h5使用dsBridge与原生app通信--桥方法
dsBridge是一个轻量级的 JS 和原生 App 的通信桥梁库,使用起来比原生方便不少支持: 1.H5 调用 Native 方法(JS → Native) 2.Native 调用 H5 方法(Native → JS) 3.支持参数传递和异步回调 4.支持 Android、iOS、以…...
package.json配置项积累
peerDependencies 用途:peerDependencies 主要用于声明一个包在其宿主项目中期望安装的依赖版本。它通常用于确保插件或库与特定版本的其他库兼容。 行为: 在 npm v7之前,如果宿主项目未安装 peerDependencies 中列出的依赖,则不…...
Python安装软件包报错 fatal error: Python.h: No such file or directory
Python安装软件包报错 fatal error: Python.h: No such file or directory Failed to import transformers.integrations.integration_utils because of the following error (look up to see its traceback): Failed to import transformers.modeling_utils because of the f…...
数据结构与算法-图论-复习1(单源最短路,全源最短路,最小生成树)
1. 单源最短路 单一边权 BFS 原理:由于边权为单一值,可使用广度优先搜索(BFS)来求解最短路。BFS 会逐层扩展节点,由于边权相同,第一次到达某个节点时的路径长度就是最短路径长度。 用法:适用…...
uniapp:微信小程序,一键获取手机号
<button open-type"getPhoneNumber" getphonenumber"getphonenumber">一键获取</button> <script>export default {methods: {getphonenumber(e){uni.login({provider: weixin,success: (res)> {console.log(res);},});},}} </scr…...
协作焊接机器人
一、核心定义与核心特点 1. 定义 协作焊接机器人是基于协作机器人本体(具备力传感、轻量化、安全停机等特性),集成焊接电源、焊枪、视觉 / 电弧传感器等模块,实现人机共融焊接作业的自动化设备。其核心在于: 安全协作:支持与焊工共同工作,无需物理隔离;柔性适配:快速…...
SpringBoot和微服务学习记录Day2
微服务 微服务将单体应用分割成更小的的独立服务,部署在不同的服务器上。服务间的关联通过暴露的api接口来实现 优点:高内聚低耦合,一个模块有问题不影响整个应用,增加可靠性,更新技术方便 缺点:增加运维…...
【CornerTag组件详解:优雅的角标设计与实现】
CornerTag组件详解:优雅的角标设计与实现 组件完整代码 <template><divclass"corner-tag":style"{background: bgColor,padding: ${paddingY}px 0,fontSize: fontSize px,...customStyle}"><slot /></div> </tem…...
Mybatis-缓存详解
什么是缓存? 存在内存中的临时数据 将用户经常查询的数据放在缓存中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题 经…...
WHAT - React useId vs uuid
目录 uuiduseId适用场景语法示例注意事项 复杂示例示例:动态表单列表 useId解读重点 useId vs uuid一句话总结对比表格示例对比useId 用于表单uuid() 用在 UI 会出问题uuid 的适合场景 总结建议 uuid 在 WHAT - Math.random?伪随机? 中我们…...
Leetcode 跳跃游戏 II (贪心算法)
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...
银河麒麟V10 Ollama+ShellGPT打造Shell AI助手——筑梦之路
环境说明 1. 操作系统版本: 银河麒麟V10 2. CPU架构:X86 3. Python版本:3.12.9 4. 大模型:mistral:7b-instruct 准备工作 1. 编译安装python 3.12 # 下载python 源码wget https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tg…...
【物联网】GPT延时
文章目录 前言一、GPT实现延时1. 定时器介绍2. I.MX6ull GPT定时器介绍1)GPT定时器工作原理2)GPT的输入捕获3)GPT的输出比较 3. 高精度延时实现1)实现思路 前言 使用 GPT 实现延时控制以及基于 PWM 实现蜂鸣器发声与频率调节这两…...
【套题】大沥2019年真题——第4题
04.数字圈 题目描述 当我们写数字时会发现有些数字有封闭区域,有的数字没有封闭区域。 数字 0 有一个封闭区域,数字 1、2、 3 都没有封闭区域,数字 4 有一个封闭区域,数字 5 没有封闭区域,数字 6 有一个封闭区域&#…...
idea 安装 proxyai 后的使用方法
1. 可以默认使用ProxyAi 安装后使用如下配置可以进行代码提示 配置 使用示例 2. 这里有必要说一下,这里要选择提供服务的ai 选择后才可以使用ProxyAI或者Custom openAI 3. 可以使用custom openAi, 要自行配置 1)配置 code completions 这是header …...
构建实时、融合的湖仓一体数据分析平台:基于 Delta Lake 与 Apache Iceberg
1. 执行摘要 挑战: 传统数据仓库在处理现代数据需求时面临诸多限制,包括高昂的存储和计算成本、处理海量多样化数据的能力不足、以及数据从产生到可供分析的端到端延迟过高。同时,虽然数据湖提供了低成本、灵活的存储,但往往缺乏…...
数据库的MVCC机制详解
MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库系统中常用的并发控制机制,它允许数据库在同一时间点保存数据的多个版本,从而实现非阻塞的读操作,提高并发性能。 MVCC的核心思想是&…...
未来与自然的交响:蓉城生态诗篇
故事背景 故事发生在中国四川成都,描绘了未来城市中科技与自然共生的奇迹。通过六个极具创意的生态场景,展现人类如何以诗意的方式重构与自然的连接,在竹海保育、文化传承、能源循环等维度编织出震撼心灵的未来图景。 故事内容 当晨雾在竹纤维…...
【愚公系列】《高效使用DeepSeek》062-图书库存管理
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
汽车软件开发常用的建模工具汇总
目录 往期推荐 1.Enterprise Architect(EA) 2.MATLAB/Simulink 3.TargetLink 4.Rational Rhapsody 5.AUTOSAR Builder 6.PREEvision 总结 往期推荐 2025汽车行业新宠:欧企都在用的工具软件ETAS工具链自动化实战指南<一&am…...
六、继承(二)
1 继承与友元 如果一个基类中存在友元关系,那么这个友元关系能不能继承呢? 例: #include <iostream> using namespace std; class Student; class Person { public:friend void Display(const Person& p, const Student& s)…...