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

Kotlin 知识点二 延迟初始化和密封类

对变量延迟初始化

Kotlin 语言的许多特性,包括变量不可变,变量不可为空,等等。这些特性
都是为了尽可能地保证程序安全而设计的,但是有些时候这些特性也会在编码时给我们带来不
少的麻烦。

比如,如果你的类中存在很多全局变量实例,为了保证它们能够满足Kotlin 的空指针检查语法标
准,你不得不做许多的非空判断保护才行,即使你非常确定它们不会为空。

下面我们通过一个具体的例子来看一下吧,就使用刚刚的UIBestP ractice 项目来作为例子。如
果你仔细观察MainActivity 中的代码,会发现这里适配器的写法略微有点特殊:

class MainActivity : AppCompatActivity(), View.OnClickListener {private var adapter: MsgAdapter? = null override fun onCreate(savedInstanceState: Bundle?) { ... adapter = MsgAdapter(msgList) ... } override fun onClick(v: View?) { ... adapter?.notifyItemInserted(msgList.size - 1) ... } 
}

这里我们将adapter设置为了全局变量,但是它的初始化工作是在onCreate()方法中进行
的,因此不得不先将adapter赋值为null,同时把它的类型声明成MsgAdapter?。

虽然我们会在onCreate()方法中对adapter进行初始化,同时能确保onClick()方法必然在
onCreate()方法之后才会调用,但是我们在onClick()方法中调用adapter的任何方法时仍
然要进行判空处理才行,否则编译肯定无法通过。

而当你的代码中有了越来越多的全局变量实例时,这个问题就会变得越来越明显,到时候你可
能必须编写大量额外的判空处理代码,只是为了满足Kotlin 编译器的要求。

幸运的是,这个问题其实是有解决办法的,而且非常简单,那就是对全局变量进行延迟初始
化。

延迟初始化使用的是lateinit关键字,它可以告诉Kotlin 编译器,我会在晚些时候对这个变量
进行初始化,这样就不用在一开始的时候将它赋值为null了。

接下来我们就使用延迟初始化的方式对上述代码进行优化,如下所示:

class MainActivity : AppCompatActivity(), View.OnClickListener {private lateinit var adapter: MsgAdapter override fun onCreate(savedInstanceState: Bundle?) { ... adapter = MsgAdapter(msgList) ... } override fun onClick(v: View?) { ... adapter.notifyItemInserted(msgList.size - 1) ... } 
}

可以看到,我们在adapter变量的前面加上了lateinit关键字,这样就不用在一开始的时候
将它赋值为null,同时类型声明也就可以改成MsgAdapter了。由于MsgAdapter是不可为空
的类型,所以我们在onClick()方法中也就不再需要进行判空处理,直接调用adapter的任何
方法就可以了。

当然,使用lateinit关键字也不是没有任何风险,如果我们在adapter变量还没有初始化的
情况下就直接使用它,那么程序就一定会崩溃,并且抛出一个
UninitializedP ropertyA ccessEx ception 异常,如图

在这里插入图片描述
当对一个全局变量使用了lateinit关键字时,请一定要确保它在被任何地方调用之前
已经完成了初始化工作,否则Kotlin 将无法保证程序的安全性。

另外,我们还可以通过代码来判断一个全局变量是否已经完成了初始化,这样在某些时候能够
有效地避免重复对某一个变量进行初始化操作,示例代码如下:

class MainActivity : AppCompatActivity(), View.OnClickListener {private lateinit var adapter: MsgAdapter override fun onCreate(savedInstanceState: Bundle?) { ... if (!::adapter.isInitialized) { adapter = MsgAdapter(msgList) } ... }

具体语法就是这样,::adapter.isInitialized可用于判断adapter变量是否已经初始
化。虽然语法看上去有点奇怪,但这是固定的写法。然后我们再对结果进行取反,如果还没有
初始化,那么就立即对adapter变量进行初始化,否则什么都不用做。

使用密封类优化代码

由于密封类通常可以结合RecyclerV iew 适配器中的ViewHolder 一起使用,因此我们就正好借
这个机会在本节学习一下它的用法。当然,密封类的使用场景远不止于此,它可以在很多时候
帮助你写出更加规范和安全的代码,所以非常值得一学。

首先来了解一下密封类具体的作用,这里我们来看一个简单的例子。新建一个Kotlin 文件,文件
名就叫Result.kt 好了,然后在这个文件中编写如下代码:

interface Result 
class Success(val msg: String) : Result 
class Failure(val error: Exception) : Result

这里定义了一个Result接口,用于表示某个操作的执行结果,接口中不用编写任何内容。然后
定义了两个类去实现Result接口:一个Success类用于表示成功时的结果,一个Failure类
用于表示失败时的结果,这样就把准备工作做好了。

接下来再定义一个getResultMsg()方法,用于获取最终执行结果的信息,代码如下所示:

fun getResultMsg(result: Result) = when (result) { is Success -> result.msg is Failure -> result.error.message else -> throw IllegalArgumentException() 
}

getResultMsg()方法中接收一个Result参数。我们通过when语句来判断:如果Result属
于Success,那么就返回成功的消息;如果Result属于Failure,那么就返回错误信息。到
目前为止,代码都是没有问题的,但比较让人讨厌的是,接下来我们不得不再编写一个else条
件,否则Kotlin 编译器会认为这里缺少条件分支,代码将无法编译通过。但实际上Result的执
行结果只可能是Success或者Failure,这个else条件是永远走不到的,所以我们在这里直接
抛出了一个异常,只是为了满足Kotlin 编译器的语法检查而已。

另外,编写else条件还有一个潜在的风险。如果我们现在新增了一个Unknown类并实现
Result接口,用于表示未知的执行结果,但是忘记在getResultMsg()方法中添加相应的条
件分支,编译器在这种情况下是不会提醒我们的,而是会在运行的时候进入else条件里面,从
而抛出异常并导致程序崩溃。

当然,这种为了满足编译器的要求而编写无用条件分支的情况不仅在Kotlin 当中存在,在Java 或
者是其他编程语言当中也普遍存在。

不过好消息是,Kotlin 的密封类可以很好地解决这个问题,下面我们就来学习一下。

密封类的关键字是sealed class,它的用法同样非常简单,我们可以轻松地将Result接口改
造成密封类的写法:

sealed class Result 
class Success(val msg: String) : Result() 
class Failure(val error: Exception) : Result()

可以看到,代码并没有什么太大的变化,只是将interface关键字改成了sealed class。另
外,由于密封类是一个可继承的类,因此在继承它的时候需要在后面加上一对括号

那么改成密封类之后有什么好处呢?你会发现现在getResultMsg()方法中的else条件已经不
再需要了,如下所示:

fun getResultMsg(result: Result) = when (result) { is Success -> result.msg is Failure -> "Error is ${result.error.message}" 
}

为什么这里去掉了else条件仍然能编译通过呢?这是因为当在when语句中传入一个密封类变量
作为条件时,Kotlin 编译器会自动检查该密封类有哪些子类,并强制要求你将每一个子类所对应
的条件全部处理。这样就可以保证,即使没有编写else条件,也不可能会出现漏写条件分支的
情况。而如果我们现在新增一个Unknown类,并也让它继承自Result,此时
getResultMsg()方法就一定会报错,必须增加一个Unknown的条件分支才能让代码编译通
过。

这就是密封类主要的作用和使用方法了。另外再多说一句,密封类及其所有子类只能定义在同
一个文件的顶层位置,不能嵌套在其他类中,这是被密封类底层的实现机制所限制的。

了解了这么多关于密封类的知识,接下来我们看一下它该如何结合MsgAdapter中的
ViewHolder 一起使用,并顺便优化一下MsgAdapter中的代码。

观看MsgAdapter现在的代码,你会发现onBindViewHolder()方法中就存在一个没有实际作
用的else条件,只是抛出了一个异常而已。对于这部分代码,我们就可以借助密封类的特性来
进行优化。首先删除MsgAdapter 中的Lef tViewHolder 和RightViewHolder ,然后新建一个
MsgViewHolder .kt 文件,在其中加入如下代码:

sealed class MsgViewHolder(view: View) : RecyclerView.ViewHolder(view)class LeftViewHolder(view: View) : MsgViewHolder(view) { val leftMsg: TextView = view.findViewById(R.id.leftMsg) 
} class RightViewHolder(view: View) : MsgViewHolder(view) { val rightMsg: TextView = view.findViewById(R.id.rightMsg) 
}

这里我们定义了一个密封类MsgViewHolder,并让它继承自RecyclerView.ViewHolder,
然后让LeftViewHolder和RightViewHolder继承自MsgViewHolder。这样就相当于密封
类MsgViewHolder只有两个已知子类,因此在when语句中只要处理这两种情况的条件分支即
可。

现在修改MsgAdapter中的代码,如下所示:

class MsgAdapter(val msgList: List<Msg>) : RecyclerView.Adapter<MsgViewHolder>() {... override fun onBindViewHolder(holder: MsgViewHolder, position: Int) {val msg = msgList[position] when (holder) { is LeftViewHolder -> holder.leftMsg.text = msg.contentis RightViewHolder -> holder.rightMsg.text = msg.content} } ... 
}

这里我们将RecyclerView.Adapter的泛型指定成刚刚定义的密封类MsgViewHolder,这样
onBindViewHolder()方法传入的参数就变成了MsgViewHolder。然后我们只要在when语
句当中处理LeftViewHolder和RightViewHolder这两种情况就可以了,那个讨厌的else终
于不再需要了,这种RecyclerV iew 适配器的写法更加规范也更加推荐。

相关文章:

Kotlin 知识点二 延迟初始化和密封类

对变量延迟初始化 Kotlin 语言的许多特性&#xff0c;包括变量不可变&#xff0c;变量不可为空&#xff0c;等等。这些特性 都是为了尽可能地保证程序安全而设计的&#xff0c;但是有些时候这些特性也会在编码时给我们带来不 少的麻烦。 比如&#xff0c;如果你的类中存在很多…...

DeepSeek开源周第二弹:DeepEP如何用RDMA+FP8让MoE模型飞起来?

一、引言&#xff1a;MoE模型的通信瓶颈与DeepEP的诞生 在混合专家&#xff08;MoE&#xff09;模型训练中&#xff0c;专家间的全对全&#xff08;All-to-All&#xff09;通信成为性能瓶颈。传统方案在跨节点传输时带宽利用率不足50%&#xff0c;延迟高达300μs以上。DeepSee…...

C++ Primer 成员访问运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

无人机遥控器的亮度 和 两个工作频率

工作频率 2.4000-2.4835 GHz &#xff0c; 5.725-5.850 GHz 1.这是一个无人机的遥控器的两个工作频率&#xff0c;为什么会有两个工作频率&#xff1f; 无人机的遥控器采用双频段设计&#xff08;2.4GHz 和 5.8GHz&#xff09;&#xff0c;主要是为了解决以下问题并优化性…...

ubuntu20.04安装docker

3台主机&#xff0c;2台都能正确安装&#xff0c;第三台怎么都安装不成功&#xff1b; 3台主机都是一样的配置和系统&#xff1b; 后来看来是其外网的ip不一样&#xff0c;导致第三台主机可能被Qiang&#xff0c;不过错误只是提示签名不正确&#xff0c;在设置签名时好像没有…...

【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现

项目介绍 本课程演示的是一款基于过滤协同算法的旅游推荐管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…...

深入解析Crawl4AI:为AI应用量身定制的高效开源爬虫框架

引言 在当今数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;和大型语言模型&#xff08;LLM&#xff09;的发展对高质量数据的需求日益增长。如何高效地从互联网上获取、处理和提取有价值的数据&#xff0c;成为了研究人员和开发者面临的关键挑战。Crawl4AI作为…...

《Effective Objective-C》阅读笔记(下)

目录 内存管理 理解引用计数 引用计数工作原理 自动释放池 保留环 以ARC简化引用计数 使用ARC时必须遵循的方法命名规则 变量的内存管理语义 ARC如何清理实例变量 在dealloc方法中只释放引用并解除监听 编写“异常安全代码”时留意内存管理问题 以弱引用避免保留环 …...

深度生成模型(二)——基本概念与数学建模

上一篇笔记中提到了端到端模型底层核心采用了深度生成模型&#xff0c;先简单梳理一下 生成式人工智能&#xff08;Artificial Intelligence Generated Content&#xff0c;AIGC&#xff09;经历了从早期基于概率模型和规则系统的方法到现代深度生成模型的跨越式发展 深度神经…...

4.WebSocket 配置与Nginx 的完美结合

序言 在现代 web 应用中&#xff0c;WebSocket 作为一种全双工通信协议&#xff0c;为实时数据传输提供了强大的支持。若要确保 WebSocket 在生产环境中的稳定性和性能&#xff0c;使用 Nginx 作为反向代理服务器是一个明智的选择。本篇文章将带你了解如何在 Nginx 中配置 Web…...

【R语言】dplyr包经典函数summarise函数

dplyr包经典函数summarise函数&#xff0c;后面改名乘reframe函数了&#xff0c;但是summarise仍然适用 这个函数的返回结果是一个新的数据框&#xff0c;下面讲一下几种常见用法 示例数据为R自带的数据集mtcars 1.不分组 mtcars %>%summarise(mean mean(disp), n n()…...

Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)

漏洞简介&#xff1a; Cuppa CMS v1.0 administrator/templates/default/html/windows/right.php文件存在任意文件读取漏洞 漏洞环境&#xff1a; 春秋云镜中的漏洞靶标&#xff0c;CVE编号为CVE-2022-25401 漏洞复现 弱口令行不通 直接访问administrator/templates/defau…...

8.Dashboard的导入导出

分享自己的Dashboard 1. 在Dashboard settings中选择 JSON Model 2. 导入 后续请参考第三篇导入光放Dashboard&#xff0c;相近...

RabbitMQ 的介绍与使用

一. 简介 1> 什么是MQ 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已。 其主要用途&#xff1a;不同进程Process/线程T…...

unity学习58:下拉列表框 dropdown的caption和options

目录 1 下拉列表框 dropdown 1.1 创建dropdown 1.2 dropdown的子物体构成 1.3 drop的子物体构成:默认灰色的模板 template 1.3.1 默认灰色的模板 template 实际是生效的&#xff0c;只是不直接显示 1.3.2 其中 item下面是下拉选项的格式 1.3.3 可以修改和新增 1.4 drop…...

STM32中使用PWM对舵机控制

目录 1、硬件JIE 2、PWM口配置 3、角度转换 4、main函数中应用 5、工程下载连接 1、硬件介绍 单片机&#xff1a;STM32F1 舵机&#xff1a;MG995 2、PWM口配置 20毫秒的PWM脉冲占空比&#xff0c;对舵机控制效果较好 计算的公式&#xff1a; PSC、ARR值的选取&#xf…...

如何免费使用稳定的deepseek

0、背景&#xff1a; 在AI辅助工作中&#xff0c;除了使用cursor做编程外&#xff0c;使用deepseek R1进行问题分析、数据分析、代码分析效果非常好。现在我经常会去拿行业信息、遇到的问题等去咨询R1&#xff0c;也给了自己不少启示。但是由于官网稳定性很差&#xff0c;很多…...

STM32内存五区及堆栈空间大小设置(启动文件浅析)

前言 嘿&#xff0c;朋友们&#xff01;今天咱们来聊聊STM32的内存五区和堆栈空间大小设置。这可是嵌入式开发里的“必修课”&#xff0c;要是没整明白&#xff0c;程序说不定就“翻车”了。别担心&#xff0c;我这就带你一步步搞懂这事儿&#xff0c;让你轻松上手&#xff0c…...

LVS+Keepalived高可用群集配置案例

以下是一个 LVSKeepalived 高可用群集配置案例&#xff1a; 1、环境准备 LVS 主调度器&#xff08;lvs1&#xff09;&#xff1a;IP 地址为 192.168.8.101&#xff0c;心跳 IP 为 192.168.4.101LVS 备调度器&#xff08;lvs2&#xff09;&#xff1a;IP 地址为 192.168.8.102…...

MySQL 中如何解决深度分页的问题? MySQL中 join、inner join、left join、right join区别

MySQL 中如何解决深度分页的问题&#xff1f; 在 MySQL 中解决深度分页问题的核心思路是减少扫描的数据量&#xff0c;尤其是避免通过 LIMIT offset, size 导致的大范围数据扫描。以下是三种优化方法及其原理、适用场景和注意事项&#xff1a; 1. 子查询 覆盖索引&#xff08…...

本地部署DeepSeek-R1(Ollama+Docker+OpenWebUI知识库)

安装Ollama 打开 Ollama官网 https://ollama.com/下载安装 Ollama服务默认只允许本机访问&#xff0c;修改允许其它主机访问 OLLAMA_HOST0.0.0.0 ollama serve也可以添加系统环境变量 都知道模型体积很大&#xff0c;顺便也通过环境变量修改模型存放位置&#xff0c;我这…...

ubuntu22.04安装docker engine

在Ubuntu 22.04上安装Docker Engine可以通过以下步骤完成&#xff1a; 更新系统包索引&#xff1a; sudo apt update安装必要的依赖包&#xff1a; 这些包允许apt通过HTTPS使用仓库。 sudo apt install -y apt-transport-https ca-certificates curl software-properties-commo…...

Protobuf原理与序列化

本文目录 1. Protobuf介绍2. Protobuf的优势3. 编写Protobuf头部全局定义消息结构具体定义字段类型定义标签号Base128编码 4. TLVProtobuf的TLV编码如何通过Varint表示300&#xff1f; 5. 编译Protobuf6. 构造消息对象 前言&#xff1a;之前写项目的时候只是简单用了下Protobuf…...

Redis|事务

文章目录 是什么能干嘛Redis 事务 VS 数据库事务怎么玩小总结 是什么 首先回想一下什么是数据库的事务&#xff1f;数据库事务是指作为单个逻辑单元执行的一系列操作&#xff0c;具备以下四个关键特性&#xff08;ACID&#xff09;&#xff1a; 原子性&#xff08;Atomicity&am…...

树莓百度百科更新!宜宾园区业务再添新篇

树莓集团宜宾园区业务不断拓展&#xff0c;主要体现在以下几个方面&#xff1a; 产业布局 -聚焦数字经济核心领域&#xff1a;涵盖软件开发、人工智能、大数据等&#xff0c;吸引众多上下游企业入驻&#xff0c;形成从芯片研发、软件开发到系统集成的完整产业链条。 -推进“双…...

设计模式教程:模板方法模式(Template Method Pattern)

一、概述 模板方法模式&#xff08;Template Method Pattern&#xff09; 是一种行为型设计模式&#xff0c;旨在定义一个操作中的算法骨架&#xff0c;而将一些步骤的具体实现延迟到子类中。通过模板方法模式&#xff0c;父类可以不改变算法结构的情况下&#xff0c;让子类重…...

unity学习54:图片+精灵+遮罩mask,旧版文本 text 和新的TMP文本

目录 1 图片 image 1.1 如果直接导入image 1.2 图片 image 和精灵 sprite 1.2.1 继续修改上面的格式 texture type 是default 1.2.2 再次关联到UI的 image 物体上就可以了 1.3 图片和遮罩 mask 1.3.1 创建1个父物体和1个子物体&#xff0c;分别都是image 1.3.2 如果父…...

【Java项目】基于Spring Boot的校园闲置物品交易网站

【Java项目】基于Spring Boot的校园闲置物品交易网站 技术简介&#xff1a;采用Java技术、Spring Boot框架、MySQL数据库等实现。 系统简介&#xff1a;校园闲置物品交易网站是一个典型的管理系统&#xff0c;主要功能包括管理员&#xff1a;首页、个人中心、用户管理、商品类…...

网页制作08-html,css,javascript初认识のhtml使用框架结构,请先建立站点!

框架一般由框架集和框架组成。 框架集就像一个大的容器&#xff0c;包括所有的框架&#xff0c;是框架的集合。 框架是框架集中一个独立的区域用于显示一个独立的网页文档。 框架集是文件html&#xff0c;它定义一组框架的布局和属性&#xff0c;包括框架的数目&#xff0c;框架…...

DeepSeek-R1:通过强化学习激励大语言模型的推理能力

摘要 本文介绍了我们的第一代推理模型&#xff0c;DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是通过大规 模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;在没有使用监督微调&#xff08;SFT&#xff09;这个前置步骤的情况下&#xff0c;展示了卓越的推…...

hbase笔记总结1

hbase是nosql的一种&#xff0c;非关系型数据库&#xff0c;not only sql&#xff0c;可处理大规模、高并发的数据&#xff0c;是web2.0以后的产物hbase的扩展性和灵活性更好&#xff0c;而且筛选能力相较于MySQL更优nosql的四大特点&#xff1a; 灵活的数据模型 &#xff08;1…...

关于C++中static_cast、const_cast、dynamic_cast的简单介绍

在C中&#xff0c;static_cast、const_cast 和 dynamic_cast 是用于类型转换的关键字&#xff0c;它们的行为和适用场景有显著区别。以下是它们的核心差异和用法总结&#xff1a; 1. static_cast 用途 用于明确且安全的类型转换&#xff0c;通常用于编译时已知类型关系的场景…...

计算机毕业设计 ——jspssm513Springboot 的小区物业管理系统

作者&#xff1a;程序媛9688 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xf…...

详解Tomcat下载安装以及IDEA配置Tomcat(2023最新)

目录 步骤一&#xff1a;首先确认自己是否已经安装JDK步骤二&#xff1a;下载安装Tomcat步骤三&#xff1a;Tomcat配置环境变量步骤四&#xff1a;验证Tomcat配置是否成功步骤五&#xff1a;为IDEA配置Tomcat 步骤一&#xff1a;首先确认自己是否已经安装JDK jdk各版本通用安…...

端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port

文章目录 需求&#xff1a;A机器是内网机器&#xff0c;B机器是公网服务器&#xff0c;想要从公网&#xff0c;访问A机器的端口方式&#xff1a;端口映射&#xff0c;内网穿透&#xff0c;使用ssh打洞端口&#xff1a;遇到问题&#xff1a;命令执行成功&#xff0c;但是端口转发…...

2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析

文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需要从中挑出一些…...

win11编译pytorch cuda128版本流程

Geforce 50xx系显卡最低支持cuda128&#xff0c;torch cu128 release版本目前还没有释放&#xff0c;所以自己基于2.6.0源码自己编译wheel包。 1. 前置条件 1. 使用visual studio installer 安装visual studio 2022&#xff0c;工作负荷选择【使用c的桌面开发】,安装完成后将…...

AI人工智能机器学习之降维和数据压缩

1、概要 本篇学习AI人工智能机器学习之降维和数据压缩&#xff0c;以主成分分析&#xff08;PCA, Principal Component Analysis&#xff09;为例&#xff0c;从代码层面讲述机器学习中的降维和数据压缩。 2、降维和数据压缩 - 简介 在机器学习和数据分析中&#xff0c;降维&…...

EasyExcel 使用指南:基础操作与常见问题

文章目录 1. EasyExcel 简介2. 基础操作2.1. 写入 Excel &#x1f525;2.2. 读取 Excel ✅2.3. 使用模板 &#x1f3a8; 3. 常见问题与解决方案3.1. 处理日期格式 &#x1f4c5;3.2. 数据写入失败&#xff1a;占位符无法匹配 ❌3.3. 内存溢出&#xff1a;大数据量处理 ⚡3.4. 空…...

本地搭建Koodo Reader书库结合内网穿透打造属于自己的移动图书馆

文章目录 前言1. Koodo Reader 功能特点1.1 开源免费1.2 支持众多格式1.3 多平台兼容1.4 多端数据备份同步1.5 多功能阅读体验1.6 界面简洁直观 2. Koodo Reader安装流程2.1 安装Git2.2 安装Node.js2.3 下载koodo reader 3. 安装Cpolar内网穿透3.1 配置公网地址3.2 配置固定公网…...

Mybatis是如何进行分页的?与Mybatis-plus的区别在哪里?

MyBatis 的分页方式及其与 MyBatis-Plus 的区别可以总结如下&#xff1a; MyBatis 的分页实现 逻辑分页&#xff08;内存分页&#xff09; 使用 RowBounds 对象&#xff0c;在查询时传入参数&#xff0c;MyBatis 会在结果集返回后&#xff0c;在内存中手动截取指定范围的数据。…...

MySQL 主从同步配置及操作步骤

主从同步是一种常见的数据复制技术&#xff0c;它通过将主库的数据同步到一个或多个从数据库中来保证数据的一致性。从库通过读取主库的 binlog 文件来获取更新并进行同步。 主从复制的方式有三种&#xff1a; 异步复制&#xff1a;不需要从库确认&#xff0c;主库提交数据后…...

【软考-架构】备战2025软考

新老教材对比 科目1&#xff08;信息系统综合&#xff09;考点详解 科目2&#xff08;系统架构设计案例&#xff09;考点详解 科目3&#xff08;系统架构设计论文&#xff09;考点详解 趋于越来越具体 学习方法推荐 第一阶段 – 基础知识阶段 建议一个半月&#xff1b; 先过…...

基于Spark的电商供应链系统的设计与实现

目录 1.研究背景与意义 2、国内外研究现状 3、相关理论与技术 &#xff08;一&#xff09;分布式计算系统Spark &#xff08;二&#xff09;数据仓库Hive &#xff08;三&#xff09;读取服务器本地磁盘的日志数据Flume &#xff08;四&#xff09;分布式消息队列Kafka …...

DaoCloud 亮相 2025 GDC丨开源赋能 AI 更多可能

2025 年 2 月 21 日至 23 日&#xff0c;上海徐汇西岸&#xff0c;2025 全球开发者先锋大会以 “模塑全球&#xff0c;无限可能” 的主题&#xff0c;围绕云计算、机器人、元宇宙等多元领域&#xff0c;探讨前沿技术创新、应用场景拓展和产业生态赋能&#xff0c;各类专业论坛、…...

基于coze+微信小程序实现图片上传并利用大模型解析

项目截图&#xff1a; 实现代码&#xff08;直接搬去可用&#xff09; 前提&#xff1a;需要填写你的oss配置coze的api授权配置&#xff01;&#xff01;&#xff01; <template><view class"container"><!-- 高斯模糊背景 --><view class&qu…...

CSS 对齐:深入理解与技巧实践

CSS 对齐:深入理解与技巧实践 引言 在网页设计中,元素的对齐是至关重要的。一个页面中元素的对齐方式直接影响到页面的美观度和用户体验。CSS 提供了丰富的对齐属性,使得开发者可以轻松实现各种对齐效果。本文将深入探讨 CSS 对齐的原理、方法和技巧,帮助开发者更好地掌握…...

Dify部署

Dify部署 安装docker 要在CentOS 7上部署Docker社区版&#xff0c;您可以按照以下步骤进行操作&#xff1a; 卸载旧版本的Docker&#xff08;如果有&#xff09;&#xff1a; yum remove docker docker-client docker-client-latest docker-common docker-latest docker-l…...

MyBatis-Plus 对比传统 MyBatis 的优势

在现代的 Java 开发中&#xff0c;MyBatis 和 MyBatis-Plus 都是流行的持久层框架。MyBatis 是一个轻量级的 ORM 框架&#xff0c;帮助开发者通过映射文件或注解方式来执行 SQL 操作。MyBatis-Plus 是在 MyBatis 基础上进行的增强&#xff0c;提供了许多简化和优化功能&#xf…...

被AWS反撸了,试一下能否申请退还

经过来回几轮沟通&#xff0c;已扣的42美金将退回31美金&#xff0c;未扣的16美金将免除扣款。 31美金的具体计算方法我不知道&#xff0c;对方的回复如下&#xff08;是了&#xff0c;AWS的客服是用中文回复的&#xff09;&#xff1a; 我理解此结果可能不完全符合您所期望的…...