文章目录

第六章:集合与函数式编程
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和takeUnless
val number = 42
val even = number.takeIf { it % 2 == 0 } // 42
val odd = number.takeUnless { it % 2 == 0 } // null
// repeat
repeat(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将为您的开发工作带来更高的效率和更好的编程体验。