Kotlin基础知识全面解析(下)
文章目录
第六章:集合与函数式编程
6.1 集合概述
Kotlin集合分为可变和不可变:
// 不可变集合val list = listOf(1, 2, 3)val set = setOf(1, 2, 3)val map = mapOf(1 to \"one\", 2 to \"two\")// 可变集合val mutableList = mutableListOf(1, 2, 3)val mutableSet = mutableSetOf(1, 2, 3)val mutableMap = mutableMapOf(1 to \"one\", 2 to \"two\")
6.2 集合操作
Kotlin提供了丰富的集合操作函数:
val numbers = listOf(1, 2, 3, 4, 5)// 过滤val evens = numbers.filter { it % 2 == 0 } // [2, 4]// 映射val squares = numbers.map { it * it } // [1, 4, 9, 16, 25]// 排序val sorted = numbers.sortedDescending() // [5, 4, 3, 2, 1]// 分组val grouped = numbers.groupBy { if (it % 2 == 0) \"even\" else \"odd\" }// {\"odd\"=[1,3,5], \"even\"=[2,4]}// 折叠val sum = numbers.fold(0) { acc, i -> acc + i } // 15
6.3 序列
序列(Sequence)是Kotlin中的惰性集合:
val sequence = sequenceOf(1, 2, 3)val generatedSequence = generateSequence(1) { it * 2 }val result = numbers.asSequence() .filter { it % 2 == 0 } .map { it * it } .toList() // [4, 16]
第七章:协程与异步编程
7.1 协程基础
协程是轻量级的线程,可以挂起和恢复:
import kotlinx.coroutines.*fun main() = runBlocking { launch { delay(1000L) println(\"World!\") } println(\"Hello,\")}// 输出:// Hello,// World!
7.2 挂起函数
使用suspend
关键字定义挂起函数:
suspend fun fetchData(): String { delay(1000L) return \"Data loaded\"}fun main() = runBlocking { val data = fetchData() println(data) // 输出: Data loaded}
7.3 异步与等待
fun main() = runBlocking { val deferred = async { delay(1000L) \"Result\" } println(\"Waiting...\") println(deferred.await()) // 输出: Result}
7.4 协程上下文与调度器
fun main() = runBlocking { launch { // 默认继承父协程的上下文 println(\"main runBlocking: ${Thread.currentThread().name}\") } launch(Dispatchers.Unconfined) { println(\"Unconfined: ${Thread.currentThread().name}\") } launch(Dispatchers.Default) { println(\"Default: ${Thread.currentThread().name}\") } launch(newSingleThreadContext(\"MyThread\")) { println(\"newSingleThreadContext: ${Thread.currentThread().name}\") }}
第八章:Kotlin标准库
8.1 作用域函数
Kotlin提供了5个作用域函数:let
, run
, with
, apply
, also
let函数
val str: String? = \"Hello\"str?.let { println(it.length) // 只在str非null时执行}
run函数
val result = \"Hello\".run { println(length) // 5 substring(1, 3) // 返回\"el\"}
with函数
val numbers = mutableListOf(1, 2, 3)with(numbers) { println(size) // 3 add(4) println(size) // 4}
apply函数
val person = Person().apply { name = \"Alice\" age = 25}
also函数
val numbers = mutableListOf(1, 2, 3)numbers.also { println(\"Before adding: $it\")}.add(4)
8.2 其他实用函数
// takeIf和takeUnlessval number = 42val even = number.takeIf { it % 2 == 0 } // 42val odd = number.takeUnless { it % 2 == 0 } // null// repeatrepeat(3) { println(\"Hello $it\")}
第九章:Kotlin与Java互操作
9.1 从Kotlin调用Java代码
Kotlin可以无缝调用Java代码:
// 调用Java类val javaList = ArrayList<String>()javaList.add(\"Kotlin\")// 处理Java中的nullability@Nullable String javaString = getNullableString();val kotlinString: String? = javaString // 自动识别为可空类型
9.2 从Java调用Kotlin代码
Java也可以调用Kotlin代码:
// 调用Kotlin函数List<Integer> list = CollectionsKt.listOf(1, 2, 3);// 调用Kotlin对象Singleton.INSTANCE.doSomething();// 处理Kotlin中的伴生对象String constant = MyClass.Companion.getCONSTANT();
9.3 互操作注意事项
- 属性访问:Kotlin属性会被编译为getter/setter方法
- 平台类型:Java类型在Kotlin中表示为\"平台类型\",如
String!
- 异常处理:Kotlin不强制处理Java检查异常
- SAM转换:Kotlin支持Java的函数式接口(Single Abstract Method)转换
第十章:Kotlin编码规范与最佳实践
10.1 命名规范
- 包名:全小写,不使用下划线
- 类名:大驼峰命名法
- 函数名:小驼峰命名法
- 常量名:全大写,下划线分隔
10.2 代码风格
- 使用4个空格缩进
- 类和方法的大括号换行
- 控制流语句的大括号不换行
- 链式调用使用换行对齐
10.3 最佳实践
- 优先使用val而不是var
- 使用数据类表示纯数据
- 避免使用!!非空断言
- 合理使用扩展函数
- 利用标准库函数简化代码
- 谨慎使用伴生对象
- 协程优于回调
10.4 性能考虑
- 序列(Sequence)用于大数据集
- 内联函数减少高阶函数开销
- 避免在热路径上创建过多对象
- 合理使用协程调度器
结语
Kotlin是一门现代、简洁且功能强大的编程语言,它结合了面向对象和函数式编程的特性,同时保持了与Java的完全互操作性。通过本指南,您已经学习了Kotlin的基础知识,包括语法、函数、类、空安全、集合、协程等重要概念。
要精通Kotlin,建议:
- 多实践,尝试用Kotlin重写现有的Java代码
- 学习Kotlin标准库中的扩展函数
- 探索Kotlin协程的高级用法
- 阅读优秀的Kotlin开源项目代码
- 关注Kotlin语言的更新和新特性
Kotlin正在快速发展,已经成为Android开发的官方语言,并在服务器端、前端和跨平台开发中占据越来越重要的地位。掌握Kotlin将为您的开发工作带来更高的效率和更好的编程体验。