Kotlin 基础语法解析
详细的 Kotlin 基础语法解析,结合概念说明和实用场景:
一、变量与常量
1. 变量类型
val(不可变变量):声明后不可重新赋值,类似 Java 的final。
val name = “Kotlin” // 类型自动推断为 String// name = “Java” // 编译错误:Val cannot be reassigned
var(可变变量):可修改值,但类型不可变。
var age = 25age = 26 // 允许// age = “26” // 编译错误:类型不匹配
2. 显式类型声明
当无法自动推断类型时,需显式声明:
var score: Int // 先声明后初始化score = 100var message: String? // 可空类型message = null
二、函数定义
1. 基本函数结构
// 完整写法fun add(a: Int, b: Int): Int {return a + b}// 单表达式简写(省略大括号和 return)fun multiply(a: Int, b: Int) = a * b
2. 默认参数与命名参数
fun connect(url: String, timeout: Int = 5000, retry: Boolean = true) { ... }// 调用connect("https://example.com") // 使用默认 timeout=5000, retry=trueconnect("https://example.com", retry = false) // 命名参数(跳过 timeout)
3. 无返回值
Unit表示无返回值(类似 Java 的void),可省略:
fun log(message: String): Unit { … }fun log(message: String) { … } // 等价写法
三、条件控制
1. if 作为表达式
Kotlin 的 if 可以返回值:
val max = if (a > b) a else b
2. when 表达式
比 Java 的 switch 更强大:
when (x) {0 -> "Zero"1, 2 -> "One or Two"in 3..10 -> "Between 3 and 10"is String -> "It's a String"else -> "Unknown"}
3. 类型检查与智能转换
fun printLength(obj: Any) {if (obj is String) {println(obj.length) // 自动转换为 String 类型}}
四、循环
1. 范围表达式
-
1..5:包含 5(闭区间) -
1 until 5:1 到 4(半开区间) -
5 downTo 1:递减 -
step 2:步长
2. 遍历集合
val list = listOf("a", "b", "c")// 遍历元素for (item in list) { ... }// 遍历索引for (index in list.indices) { ... }// 同时获取索引和值for ((index, value) in list.withIndex()) { ... }
五、类与对象
1. 主构造函数
直接在类名后声明:
class Person(val name: String, var age: Int) {// 类体}
val生成只读属性,var生成可变属性。
2. 次构造函数
使用 constructor 关键字:
class Person(val name: String) {var age: Int = 0constructor(name: String, age: Int) : this(name) {this.age = age}}
3. 数据类(data class)
自动生成 equals()、hashCode()、toString() 和 copy():
data class User(val id: Int, val email: String)// 使用val user = User(1, "user@example.com")val copyUser = user.copy(email = "new@example.com") // 修改部分属性
4. 伴生对象(companion object)
替代 Java 的静态方法:
class MyClass {companion object {fun create() = MyClass()}}// 调用val instance = MyClass.create()
六、空安全机制
1. 可空类型
通过 ? 声明可空:
var str: String? = null// str.length // 编译错误:需处理可空性
2. 安全调用操作符 ?.
避免空指针:
val length = str?.length // 返回 Int?(可能为 null)
3. Elvis 操作符 ?:
提供默认值:
val len = str?.length ?: 0 // 若 str 为 null,返回 0
4. 非空断言 !!
强制解除可空(慎用):
val forcedLen = str!!.length // 若 str 为 null,抛出 NPE
七、集合操作
1. 集合类型
-
不可变集合:
listOf(),setOf(),mapOf() -
可变集合:
mutableListOf(),mutableSetOf(),mutableMapOf()
2. 常用操作符
val numbers = listOf(1, 2, 3, 4, 5)// 过滤val evens = numbers.filter { it % 2 == 0 }// 转换val squares = numbers.map { it * it }// 分组val groups = numbers.groupBy { if (it % 2 == 0) "even" else "odd" }// 聚合val sum = numbers.reduce { acc, num -> acc + num }
八、扩展函数
1. 为现有类添加方法
fun String.addExclamation() = "$this!"// 使用println("Hello".addExclamation()) // 输出:Hello!
2. 扩展属性
val String.lastChar: Charget() = this[length - 1]// 使用println("Kotlin".lastChar) // 输出:n
九、Lambda 表达式
1. 基本语法
val sum: (Int, Int) -> Int = { a, b -> a + b }println(sum(2, 3)) // 输出:5
2. 高阶函数
将函数作为参数传递:
fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {return operation(a相关文章:
Kotlin 基础语法解析
详细的 Kotlin 基础语法解析,结合概念说明和实用场景: 一、变量与常量 1. 变量类型 val(不可变变量):声明后不可重新赋值,类似 Java 的 final。 val name “Kotlin” // 类型自动推断为 String// name …...
MaxEnt模型进阶:基于R语言自动化与GIS空间建模的物种栖息地精准预测
生物多样性的空间分布规律及其对环境变化的响应机制,是生态学与地理学研究的前沿议题。在气候变化加剧和人类活动干扰的双重压力下,如何精准预测物种潜在分布范围、识别关键环境驱动因子,已成为制定生物保护策略的核心科学问题。物种分布模型…...
微软 GraphRAG 项目学习总结
微软2024年4月份发布了一篇《From Local to Global: A GraphRAG Approach to Query-Focused Summarization》(GraphRAG:从局部到全局的查询式摘要方法)论文,提出了一种名为GraphRAG的检索增强生成(RAG)方法…...
C# dataGridView 自动生成几行几列及手动输入整型字符
C# dataGridView生成12号4列的表格 private void Form1_Load(object sender, EventArgs e) {// 清除默认列dataGridView1.Columns.Clear();// 添加4列(首列为序号列)dataGridView1.Columns.Add("ColIndex", "序号");dataGridView1.…...
CSS层叠顺序
介绍 在 CSS 中,元素的层叠顺序决定了当多个元素重叠时(跟布局没有完全的关系,也就是说层叠顺序只会在几个叠放元素上进行比较,而不会改变布局),哪个元素显示在最上面,哪个元素显示在最下面。 …...
QtAV入门
QtAV 是一个基于 FFmpeg 和 Qt 的高性能多媒体播放框架,提供强大的音视频解码、渲染和处理能力,适合开发跨平台的播放器、视频编辑和流媒体应用。 1. 核心功能 多格式支持 支持 H.264/H.265、VP9、AV1 等视频编码。 支持 MP3、AAC、Opus 等音频编码。 封装格式:MP4、MKV、…...
Day17 -实例:利用不同语言不同框架的特征 进行识别
前置:我们所需的web站点,都可以利用fofa去搜索,例如:app"flask"这样的语句去找对应的站点,找到后,我们模拟不知道是什么框架,再根据特征去判断它的框架。 ***利用工具可以再去结合大…...
Pycharm(八):字符串切片
一、字符串分片介绍 对操作的对象截取其中一部分的操作,比如想要获取字符串“888666qq.com前面的qq号的时候就可以用切片。 字符串、列表、元组都支持切片操作。 语法:字符串变量名 [起始:结束:步长] 口诀:切片其实很简单,只顾头来…...
leetcode 53.Maximum Subarray
分治法 //lSum表示[left,right]内以left为左端点的最大子段和 //rSum表示[left,right]内以right为右端点的最大字段和 //iSum表示[left,right]的区间和 int divide_conquer(int* nums,int left,int right,int *lSum,int *rSum,int *iSum){int maxSum;//表示[left,right]内的最…...
Mysql从入门到精通day5————子查询精讲
本文主要讲述子查询的几种方法,读者注意体会它们的不同场合的适用情况及功能,本篇文章也融入了小编实践过程遇到的坑,希望读者不要再踩坑 一.带IN关键字的子查询 in关键字可以检测结果集中是否存在某个特定的值,检测成功则执行外…...
虫洞数观系列二 | Python+MySQL高效封装:为pandas数据分析铺路
目录 系列文章 1. 引言 2. 常规写法mysql 3. 封装设计接口mysql 3.1dbname.py文件 3.1.1. 导入和基类定义 3.1.2. 具体表定义类 3.1.3. 表定义整合函数 3.1.4. 全局字典和测试代码 3.2mysql_dao文件 3.2.1. 模块导入与配置 3.2.2. 数据库连接池初始化 3.2.3. Comm…...
算法刷题-最近公共祖先-LCA
AcWing 1172 祖孙询问 一、题目描述 给定一棵包含 n 个节点的有根无向树,节点编号互不相同,但不一定是 1∼n。 有 m 个询问,每个询问给出了一对节点的编号 x 和 y,询问 x 与 y 的祖孙关系。 输入格式 第一行一个整数 n 表示节…...
MySQl之Binlog
前言 Binlog(Binary Log)是MySQL中至关重要的日志模块,它直接关系到数据恢复、主从复制等高阶架构设计。无论你是刚入门的新手还是有一定经验的开发者,掌握Binlog的原理和应用都是进阶的必经之路。 BinLog是什么? Bin…...
开源项目解读(https://github.com/zjunlp/DeepKE)
1.DeepKE 是一个开源的知识图谱抽取与构建工具,支持cnSchema、低资源、长篇章、多模态的知识抽取工具,可以基于PyTorch实现命名实体识别、关系抽取和属性抽取功能。同时为初学者提供了文档,在线演示, 论文, 演示文稿和海报。 2.下载对应的de…...
「MethodArgumentTypeMismatchException:前端传递 ‘undefined‘ 导致 Integer 类型转换失败」
遇到的问题: Failed to convert value of type java.lang.String to required type java.lang.Integer; nested exception is java.lang.NumberFormatException: For input string: "undefined" 原因分析: 大致意思就是我传递的参数到后端没…...
LabVIEW故障诊断数据处理方法
在LabVIEW故障诊断系统中,数据处理直接决定诊断的准确性和效率。工业现场常面临噪声干扰、数据量大、实时性要求高等挑战,需针对性地选择处理方法。本文结合电机故障诊断、轴承损伤检测等典型案例,详解数据预处理、特征提取、模式识别三大核心…...
基于 SpringBoot 的火车订票管理系统
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...
Python的概论
免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:: 提示:以下是本篇文章正文内容,…...
构建大语言模型应用:句子转换器(Sentence Transformers)(第三部分)
本系列文章目录 简介数据准备句子转换器(本文)向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 在之前的博客中,我们学习了为RAG(检索增强生成,Retrieval Augmented Generati…...
怎样提升大语言模型(LLM)回答准确率
怎样提升大语言模型(LLM)回答准确率 目录 怎样提升大语言模型(LLM)回答准确率激励与规范类知识关联类情感与语境类逆向思维类:为什么不,反面案例群体智慧类明确指令类示例引导类思维引导类约束限制类反馈交互类:对话激励与规范类 给予奖励暗示:在提示词中暗示模型如果回…...
【进阶】vscode 中使用 cmake 编译调试 C++ 工程
基于 MSYS2 的 MinGW-w64 GCC 工具链与 CMake 构建系统,结合VSCode及其扩展插件( ms-vscode.cmake-tools),可实现高效的全流程C开发调试。既可通过 VSCode 可视化界面(命令面板、状态栏按钮)便捷完成配置、…...
流影---开源网络流量分析平台(三)(管理引擎部署)
目录 前沿 功能介绍 部署过程 前沿 在上一篇文章中,最后因为虚拟机的资源而没看到最后的效果,而是查看了日志,虽然效果是有了,但后来我等了很久,还是那个转圈的画面,所以我猜测可能是少了什么东西&#…...
QT Quick(C++)跨平台应用程序项目实战教程 5 — 界面设计
目录 1.版面设计 2. 自定义按钮 2.1 自定义工具栏按钮 2.2 自定义图标按钮 3. 顶部工具栏 4. 主体 5. 底部工具栏 6. 主文件 7. 最终效果 上一章内容讲解了QML基本使用方法。本章内容继续延续“音乐播放器”项目主线,完成程序的界面设计任务。 1.版面设计…...
【微服务架构】SpringCloud Alibaba(三):负载均衡 LoadBalance
文章目录 SpringCloud Alibaba1、核心组件2、优势3、应用场景 一、Loadbalance介绍二、Ribbon和Loadbalance 对比三、整合LoadBlance1、升级版本2、移除ribbon依赖,增加loadBalance依赖 四、自定定义负载均衡器五、重试机制六、源码分析1、猜测源码的实现2、初始化过…...
关于音频采样率,比特,时间轴的理解
是的,你的理解完全正确!-ar、-af aresampleasync1000 和 -b:a 64k 分别用于控制音频的采样率、时间戳调整和比特率。它们各自有不同的作用,但共同确保音频的质量和同步性。下面我将详细解释每个参数的作用和它们之间的关系。 1. -ar 参数 作用…...
06-02-自考数据结构(20331)- 查找技术-动态查找知识点
自考数据结构动态查找算法主要讲二叉树和平衡二叉树,但是感觉到了,就又续接了一部分,所以这篇备考的小伙伴着重看前两种就可以了。 知识拓扑 知识点介绍 二叉排序树(BST) 定义 二叉排序树(Binary Search Tree)又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二…...
【Vue2插槽】
Vue2插槽 Vue2插槽默认插槽子组件代码(Child.vue)父组件代码(Parent.vue) 命名插槽子组件代码(ChildNamed.vue)父组件代码(ParentNamed.vue) 代码解释 Vue2插槽 Vue2插槽 下面为你详…...
Upload-labs 靶场搭建 及一句话木马的原理与运用
1、phpstudy及upload-labs下载 (1)下载phpstudy小皮面板 首先需要软件phpstudy 下载地址 phpStudy下载-phpStudy最新版下载V8.1.1.3 -阔思亮 (2)然后到github网址下载源码压缩包 网址 https://github.com/c0ny1/upload-labs 再…...
爬虫的第三天——爬动态网页
一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点: 用户交互:动态网页能够根据用户的请求而生成不同的内容。内容动态生成:数据来自数据库、API或用户输入。客户端动态渲染:浏览器…...
vue状态管理器pinia、pinia-plugin-persist持久化储存
vue状态管理器pinia、pinia-plugin-persist持久化储存 一、简介二、配置状态管理器,需安装pinia、pinia-plugin-persist三、定义store:defineStore五、pinia中的Getter六、pinia中的Action七、pinia-plugin-persist持久化储存配置 一、简介 Pinia 是一个…...
