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

Kotlin 中 集合 Collection 的扩展方法完全指南

Kotlin 中 Collection 的扩展方法完全指南

“代码是最美的诗篇”——本文将带你进入 Kotlin 集合扩展函数的世界,帮助你写出既高效又优雅的代码 🚀


一、引言 🤔

在 Android 开发中,集合(Collection)的操作无处不在。无论是处理网络请求返回的数据、解析 JSON 结构,还是进行数据统计与分析,Kotlin 的丰富 API 都使得我们的代码更简洁明了。而扩展函数正是 Kotlin 的一大亮点,让我们可以在不修改原有类定义的前提下,方便地扩展功能。
本文将详细讲解 Kotlin 集合扩展函数的原理、常用方法、最佳实践、性能优化,以及项目实战案例,希望能为开发者在日常工作中提供切实的帮助。😊


二、Kotlin 中 Collection 的基本类型概览 🧺

在开始深入扩展函数之前,我们先来回顾一下 Kotlin 中最常见的集合类型。

1. 不可变集合 vs. 可变集合

Kotlin 默认提供了不可变集合如 ListSetMap,这种设计有助于提高代码的稳定性和线程安全性。如果需要对集合进行修改,则需要使用 MutableListMutableSetMutableMap 等对应的可变类型。

示例代码:
val immutableList = listOf("A", "B", "C")
val mutableList = mutableListOf("A", "B", "C")
mutableList.add("D")

2. 创建集合的技巧

  • 使用 arrayOflistOfsetOfmapOf 快速创建集合
  • 利用 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 forEachforEachIndexed
  • 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 -> filterfilter -> map 的执行效率差异。

2. 惰性序列 asSequence() 的应用

  • 何时使用:对于大量数据处理,使用 asSequence() 将集合转为序列,在链式调用时采用惰性计算,能有效减少临时对象的创建:
    val lazyResult = list.asSequence().filter { it % 2 == 0 }.map { it * it }.toList()
    
  • 注意事项:虽然惰性序列在数据量大时具有优势,但在数据较小时直接使用集合操作可能更直观,因序列本身也有额外开销。

3. 多层嵌套与内联函数

  • 内联函数:对于高频调用的扩展函数,考虑用 inline 提升性能。
  • 跨 inline 控制:理解 noinlinecrossinline 的用法,防止不必要的内联代码膨胀。

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 进行异步数据变换:
    import kotlinx.coroutines.flow.asFlow
    import kotlinx.coroutines.flow.mapval flowResult = listOf(1, 2, 3).asFlow().map { it * 2 }// 后续可以使用 collect 进行数据消费
    
    此种方式可以结合 Android 架构组件,构建高效的数据流处理流程。

八、项目实战案例演示 📱

通过实际案例,我们可以更直观地感受到 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 集合扩展函数的世界&#xff0c;帮助你写出既高效又优雅的代码 &#x1f680; 一、引言 &#x1f914; 在 Android 开发中&#xff0c;集合&#xff08;Collection&#xff09;的操作…...

STM32F407使用ESP8266连接阿里云并上传数据

文章目录 前言一、ESP01S介绍1.ESP01S2.MQTT固件烧录3.WIFI连接 二、阿里云平台介绍1.创建产品及添加设备2.连接云平台 三、数据上报四、命令下发五、完整工程 前言 在实现OTA功能我们必须学会如何连接云平台&#xff0c;本文会仔细介绍使用STM32F407和ESP8266连接阿里云平台&…...

TorchServe部署模型-index_to_name.json

在TorchServe部署模型时&#xff0c;若要将模型输出结果映射到指定标签&#xff08;如分类任务的类别名称&#xff09;&#xff0c;需通过index_to_name.json文件定义索引与标签的映射关系&#xff0c;并在打包模型时将其作为额外文件包含。以下是完整流程和命令示例&#xff1…...

每日一题——BMN3 小红炸砖块

“落下”操作只会对y轴有影响&#xff0c;所以注意y轴的变化即可 只要给出的坐标有砖块&#xff0c;就遍历查找他的上面是否有砖块&#xff0c;每一层都是这样&#xff0c;直到到没有砖块的那一层&#xff1b; 注意&#xff1a;定义矩阵时要注意&#xff0c;给出的坐标都是大…...

AWS服务器 磁盘空间升级到100G后,怎么使其生效?

在AWS&#xff08;Amazon Web Services&#xff09;上扩展EBS&#xff08;Elastic Block Store&#xff09;卷的大小后&#xff0c;服务器操作系统并不会自动识别新增的空间。要使操作系统识别并使用新增的磁盘空间&#xff0c;您需要进行一些额外的步骤。以下是详细的指导和说…...

AWS弹性容器服务(AWS Elastic Container Service,ECS)概述

李升伟 编译 标签&#xff1a;AWS | ECS | 容器 | Docker AWS弹性容器服务&#xff08;AWS Elastic Container Service&#xff0c;ECS&#xff09;简介 AWS弹性容器服务&#xff08;ECS&#xff09;是一项完全托管的容器编排服务&#xff0c;支持运行、管理和扩展容器化应用…...

【消息队列kafka_中间件】一、快速入门分布式消息队列

在当今大数据和分布式系统盛行的时代&#xff0c;消息队列作为一种关键的中间件技术&#xff0c;发挥着举足轻重的作用。其中&#xff0c;Apache Kafka 以其卓越的性能、高可扩展性和强大的功能&#xff0c;成为众多企业构建分布式应用的首选消息队列解决方案。本篇文章将带你深…...

【Axure元件分享】移动端滑动拨盘地区级联选择器

在移动端产品设计中&#xff0c;地区级联选择器&#xff08;省/市/区&#xff09;是用户信息录入场景的核心组件&#xff0c;尤其在电商收货地址、政务信息填报等高频业务中直接影响表单转化率。本文将介绍一款基于Axure的三级动态联动机型地区选择器&#xff0c;通过仿真级联滚…...

宁德时代25年校招演绎数字推理SHL测评题库题型及真题分析

非常感谢您对宁德时代的关注。祝贺您通过宁德时代校园招聘的专业面试环节&#xff0c;现邀请您参与完成以下测评。本轮共两份测评&#xff0c;每份测评对您的最终结果都非常重要&#xff0c;请务必在收到测评后48小时内完成!本测评需要进行远程监考&#xff0c;如果您无法或不愿…...

Python-Django+vue宠物服务管理系统功能说明

❥(^_-) 上千个精美定制模板,各类成品Java、Python、PHP、Android毕设项目,欢迎咨询。 ❥(^_-) 程序开发、技术解答、代码讲解、文档,💖文末获取源码+数据库+文档💖 💖软件下载 | 实战案例 💖文章底部二维码,可以联系获取软件下载链接,及项目演示视频。 本项目…...

洛谷普及B3691 [语言月赛202212] 狠狠地切割(Easy Version)

题目&#xff1a;[语言月赛202212] 狠狠地切割(Easy Version) 题号&#xff1a;B3691 难度&#xff1a;普及一 末尾包含对二分法优化的详细解释 题目分析 最后一句应该是本题的考查关键&#xff0c;关于筛选算法的时间优化&#xff0c; 但从功能理论上&#xff0c;我找到了…...

FPGA_BD Block Design学习(一)

PS端开发流程详细步骤 1.第一步&#xff1a;打开Vivado软件&#xff0c;创建或打开一个工程。 2.第二步&#xff1a;在Block Design中添加arm核心&#xff0c;并将其配置为IP核。 3.第三步&#xff1a;配置arm核心的外设信息&#xff0c;如DDR接口、时钟频率、UART接口等。 …...

Collection vs Collections:核心区别与面试指南

Collection vs Collections&#xff1a;核心区别与面试指南 一、本质区别&#xff08;核心记忆点&#xff09; 维度CollectionCollections身份集合框架的根接口操作集合的工具类包位置java.utiljava.util是否可实例化❌ 接口✅ 类&#xff08;但构造器私有&#xff0c;不可实…...

sqlite3基本语句

创建表 CREATE TABLE student ( id INTEGER PRIMARY KEY, -- 学号&#xff0c;主键 name TEXT NOT NULL, -- 姓名&#xff0c;不能为空 age INTEGER, -- 年龄 gender TEXT -- 性别 ); SQLite常用数据类型 主键 …...

jupyter notebook 显示conda虚拟环境

使用 nb_conda_kernels 安装 nb_conda_kernels&#xff1a;这个包可以自动从你的 Conda 环境中发现并列出内核。 conda activate base # 确保你在 base 环境或任何其他环境中安装 conda install nb_conda_kernels显示jupyternotebook当前所在的位置。...

华为海思IC前端中后端(COTXPU)岗位笔试机考题

近期华为海思即将开始IC设计实现实习岗位机考。小编今天给大家分享下华为海思相关机考题目。 华为海思2025届校招笔试面试经验分享 每年IC秋招笔试其实也是从题库中随机抽出一些题。 华为海思2025届校招笔试面试经验分享华为海思机考主要分三个方向&#xff0c;分别是物理方向…...

HarmonyOS NEXT 实现滑动拼图验证码功能

大家好&#xff0c;我是 V 哥。 在 Gitee 上看到一个用 Java 实现的 HarmonyOS 滑动拼图验证码功能&#xff0c;已经太老了&#xff0c;鸿蒙开发推荐使用 ArkTS 语言&#xff0c;V 哥来改造一下。 以下是基于 ArkTS 的实现方案。由于鸿蒙系统的特性差异&#xff0c;这里提供核…...

【XML基础-1】深入理解XML:介绍、语法规则与实际应用

XML&#xff08;可扩展标记语言&#xff09;作为数据表示和交换的标准格式&#xff0c;自1998年问世以来已成为现代计算领域不可或缺的一部分。本文将全面介绍XML的基础概念、详细语法规则以及它在各领域中的实际应用。 1. 什么是XML&#xff1f; XML&#xff08;eXtensible …...

STM32 HAL库扩大USB CDC的输入缓冲区

STM32 HAL库,使用USB, 扩大输入暂存区的方法 使用STM32的USB通讯CubeMX建立配置Serial Wire时钟配置USB配置时钟频率设置代码编写运行效果总结使用STM32的USB通讯 STM32可以不用使用串口转换直接和USB通讯。这给串口调试提供了极大的方便。编程,我使用了STM32CubeIDE编程。这…...

迭代器模式深度解析与实战案例

一、模式定义 迭代器模式&#xff08;Iterator Pattern&#xff09; 是一种行为设计模式&#xff0c;提供一种方法顺序访问聚合对象的元素&#xff0c;无需暴露其底层表示。核心思想是将遍历逻辑从聚合对象中分离&#xff0c;实现 遍历与存储的解耦。 二、核心组件 组件作用…...

Kotlin协程实用模版合集

目录 ✅ Kotlin 协程实用模板合集&#xff08;适合 Android 项目&#xff09; &#x1f4e6; 1. 基础挂起函数封装&#xff08;Repository 层&#xff09; ⚙️ 2. ViewModel 中使用协程 状态处理 ⏱️ 3. 带超时控制的挂起操作 &#x1f91d; 4. 并发请求合并&#xff0…...

基于Flask的Windows事件ID查询系统开发实践

基于Flask的Windows事件ID查询系统开发实践 一、项目背景与功能概述 Windows操作系统的事件日志系统记录了数百种不同的事件ID&#xff0c;每个ID对应特定的系统事件。本文介绍如何构建一个基于Web的事件ID查询系统&#xff0c;主要实现以下功能&#xff1a; 数据可视化展示…...

机器人编程基础---C语言中的运算符

C语言中的运算符 算术运算符关系运算符逻辑运算符位运算符C语言提供了多种运算符来执行不同的操作。 算术运算符 + 加法- 减法* 乘法/ 除法% 取模(求余)++ 自增-- 自减int a = 10, b = 5; int sum = a + b;...

设计模式之迭代器模式:遍历的艺术与实现

引言 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;它提供了一种顺序访问聚合对象中各个元素的方法&#xff0c;而又不暴露其底层实现。迭代器模式将遍历逻辑与聚合对象解耦&#xff0c;使得我们可以用统一的方式处理不同的集合结构。…...

React七案例中

代码下载 地图找房模块 顶部导航栏 封装NavHeader组件实现城市选择&#xff0c;地图找房页面的复用&#xff0c;在 components 目录中创建组件 NavHeader&#xff0c;把之前城市列表写过的样式复制到 NavHeader.scss 下&#xff0c;在该组件中封装 antd-mobile 组件库中的 N…...

消息中间件篇——RabbitMQ,Kafka

RabbitMQ 如何保证消息不丢失&#xff1f; 生产者确认机制 消息持久化 消费者确认机制 RabbitMQ如何保证消息不丢失&#xff1f; RabbitMQ的重复消费问题如何解决&#xff1f; RabbitMQ中死信交换机&#xff08;RabbitMQ延迟队列有了解过吗&#xff1f;&#xff09; 延迟队列…...

HOW - 实现 useClickOutside 或者 useClickAway

场景 在开发过程中经常遇到需要点击除某div范围之外的区域触发回调&#xff1a;比如点击 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 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 下列哪个选项是python中的关键字&#xff1f; A. function B. class C. method D. object…...

兆讯MH2103系列pin to pin替代STM32F103,并且性能超越

MH2103 是一款高性能的 32 位微控制器&#xff0c;由兆讯恒达推出&#xff0c;主要用于替代 STM32F103 系列产品。以下是关于 MH2103 芯片的详细介绍&#xff1a; 技术规格 内核与主频&#xff1a; 采用高性能 32 位 Cortex-M3 内核&#xff0c;最高工作频率可达 216 MHz。支…...

h5使用dsBridge与原生app通信--桥方法

dsBridge是一个轻量级的 JS 和原生 App 的通信桥梁库,使用起来比原生方便不少支持&#xff1a; 1.H5 调用 Native 方法&#xff08;JS → Native&#xff09; 2.Native 调用 H5 方法&#xff08;Native → JS&#xff09; 3.支持参数传递和异步回调 4.支持 Android、iOS、以…...

package.json配置项积累

peerDependencies 用途&#xff1a;peerDependencies 主要用于声明一个包在其宿主项目中期望安装的依赖版本。它通常用于确保插件或库与特定版本的其他库兼容。 行为&#xff1a; 在 npm v7之前&#xff0c;如果宿主项目未安装 peerDependencies 中列出的依赖&#xff0c;则不…...

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 原理&#xff1a;由于边权为单一值&#xff0c;可使用广度优先搜索&#xff08;BFS&#xff09;来求解最短路。BFS 会逐层扩展节点&#xff0c;由于边权相同&#xff0c;第一次到达某个节点时的路径长度就是最短路径长度。 用法&#xff1a;适用…...

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

微服务 微服务将单体应用分割成更小的的独立服务&#xff0c;部署在不同的服务器上。服务间的关联通过暴露的api接口来实现 优点&#xff1a;高内聚低耦合&#xff0c;一个模块有问题不影响整个应用&#xff0c;增加可靠性&#xff0c;更新技术方便 缺点&#xff1a;增加运维…...

【CornerTag组件详解:优雅的角标设计与实现】

CornerTag组件详解&#xff1a;优雅的角标设计与实现 组件完整代码 <template><divclass"corner-tag":style"{background: bgColor,padding: ${paddingY}px 0,fontSize: fontSize px,...customStyle}"><slot /></div> </tem…...

Mybatis-缓存详解

什么是缓存&#xff1f; 存在内存中的临时数据 将用户经常查询的数据放在缓存中&#xff0c;用户去查询数据就不用从磁盘上&#xff08;关系型数据库数据文件&#xff09;查询&#xff0c;从缓存中查询&#xff0c;从而提高查询效率&#xff0c;解决了高并发系统的性能问题 经…...

WHAT - React useId vs uuid

目录 uuiduseId适用场景语法示例注意事项 复杂示例示例&#xff1a;动态表单列表 useId解读重点 useId vs uuid一句话总结对比表格示例对比useId 用于表单uuid() 用在 UI 会出问题uuid 的适合场景 总结建议 uuid 在 WHAT - Math.random&#xff1f;伪随机&#xff1f; 中我们…...

Leetcode 跳跃游戏 II (贪心算法)

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...

银河麒麟V10 Ollama+ShellGPT打造Shell AI助手——筑梦之路

环境说明 1. 操作系统版本: 银河麒麟V10 2. CPU架构&#xff1a;X86 3. Python版本&#xff1a;3.12.9 4. 大模型&#xff1a;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&#xff09;GPT定时器工作原理2&#xff09;GPT的输入捕获3&#xff09;GPT的输出比较 3. 高精度延时实现1&#xff09;实现思路 前言 使用 GPT 实现延时控制以及基于 PWM 实现蜂鸣器发声与频率调节这两…...

【套题】大沥2019年真题——第4题

04.数字圈 题目描述 当我们写数字时会发现有些数字有封闭区域&#xff0c;有的数字没有封闭区域。 数字 0 有一个封闭区域&#xff0c;数字 1、2、 3 都没有封闭区域&#xff0c;数字 4 有一个封闭区域&#xff0c;数字 5 没有封闭区域&#xff0c;数字 6 有一个封闭区域&#…...

idea 安装 proxyai 后的使用方法

1. 可以默认使用ProxyAi 安装后使用如下配置可以进行代码提示 配置 使用示例 2. 这里有必要说一下&#xff0c;这里要选择提供服务的ai 选择后才可以使用ProxyAI或者Custom openAI 3. 可以使用custom openAi, 要自行配置 1&#xff09;配置 code completions 这是header …...

构建实时、融合的湖仓一体数据分析平台:基于 Delta Lake 与 Apache Iceberg

1. 执行摘要 挑战&#xff1a; 传统数据仓库在处理现代数据需求时面临诸多限制&#xff0c;包括高昂的存储和计算成本、处理海量多样化数据的能力不足、以及数据从产生到可供分析的端到端延迟过高。同时&#xff0c;虽然数据湖提供了低成本、灵活的存储&#xff0c;但往往缺乏…...

数据库的MVCC机制详解

MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是数据库系统中常用的并发控制机制&#xff0c;它允许数据库在同一时间点保存数据的多个版本&#xff0c;从而实现非阻塞的读操作&#xff0c;提高并发性能。 MVCC的核心思想是&…...

未来与自然的交响:蓉城生态诗篇

故事背景 故事发生在中国四川成都&#xff0c;描绘了未来城市中科技与自然共生的奇迹。通过六个极具创意的生态场景&#xff0c;展现人类如何以诗意的方式重构与自然的连接&#xff0c;在竹海保育、文化传承、能源循环等维度编织出震撼心灵的未来图景。 故事内容 当晨雾在竹纤维…...

【愚公系列】《高效使用DeepSeek》062-图书库存管理

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

汽车软件开发常用的建模工具汇总

目录 往期推荐 1.Enterprise Architect&#xff08;EA&#xff09; 2.MATLAB/Simulink 3.TargetLink 4.Rational Rhapsody 5.AUTOSAR Builder 6.PREEvision 总结 往期推荐 2025汽车行业新宠&#xff1a;欧企都在用的工具软件ETAS工具链自动化实战指南&#xff1c;一&am…...

六、继承(二)

1 继承与友元 如果一个基类中存在友元关系&#xff0c;那么这个友元关系能不能继承呢&#xff1f; 例&#xff1a; #include <iostream> using namespace std; class Student; class Person { public:friend void Display(const Person& p, const Student& s)…...