太棒了!我们继续深入,探索 Kotlin 更核心、更强大的特性。这一部分将让你真正体会到 Kotlin 相比 Java 的优雅和高效。
Kotlin 基础进阶:解锁现代编程的威力
八、数据类型:不只是"一切皆对象"
Kotlin 对数据类型做了精心设计,区分了可空与否,并且所有类型都是对象,没有 Java 中的基本类型和包装类型之分。
-
基本类型
- 数值类型 :
Byte,Short,Int,Long,Float,Double - 其他类型 :
Char(字符),Boolean(布尔值),String(字符串)
kotlinval number: Int = 100 // 整数 val pi: Double = 3.14 // 双精度浮点数 val isKotlinFun: Boolean = true // 布尔值 val letter: Char = 'A' // 字符 val text: String = "Hello" // 字符串 - 数值类型 :
-
智能类型转换
Kotlin 编译器非常智能,一旦进行了类型检查,在后续作用域内会自动进行类型转换。
kotlinfun printLength(obj: Any) { // Any 是 Kotlin 中所有类的基类,类似 Java 的 Object if (obj is String) { // 类型检查 // 在这个分支内,obj 被自动转换为 String 类型 println(obj.length) // 可以直接调用 String 的方法 } // 或者使用 `!is` 进行否定判断 if (obj !is String) return println(obj.length) // 这里 obj 也是 String 类型 }对比 Java: 在 Java 中需要显式强制转换:
if (obj instanceof String) { String str = (String) obj; }
九、集合:功能强大的数据容器
Kotlin 的集合分为可变和不可变两种,这是非常重要的设计理念。
-
List(列表)
arduino// 不可变列表 - 只能读取,不能修改 val readOnlyList: List<String> = listOf("Apple", "Banana", "Orange") println(readOnlyList[0]) // 输出:Apple // readOnlyList.add("Grape") // 错误!不可变列表不能添加元素 // 可变列表 - 可以修改 val mutableList: MutableList<String> = mutableListOf("Apple", "Banana") mutableList.add("Grape") // 正确! mutableList[0] = "Apricot" // 修改元素 -
Set(集合)和 Map(映射)
arduino// Set - 不重复元素的集合 val set = setOf(1, 2, 3, 2, 1) // 结果: [1, 2, 3] // Map - 键值对 val map = mapOf("name" to "Kotlin", "version" to "1.9") println(map["name"]) // 输出:Kotlin
十、循环:更优雅的遍历方式
-
for 循环
scssval fruits = listOf("Apple", "Banana", "Orange") // 遍历集合元素 for (fruit in fruits) { println(fruit) } // 遍历索引和值 for ((index, fruit) in fruits.withIndex()) { println("$index: $fruit") } // 遍历数字范围 for (i in 1..5) { // 包含 1 和 5 println(i) } for (i in 1 until 5) { // 不包含 5 println(i) } for (i in 5 downTo 1 step 2) { // 从5到1,步长为2 println(i) // 输出:5, 3, 1 } -
while 和 do-while(与 Java 相同)
scssvar x = 10 while (x > 0) { println(x) x-- }
十一、函数进阶:默认参数、命名参数、扩展函数
-
默认参数:为函数参数提供默认值
kotlinfun greet(name: String, greeting: String = "Hello") { println("$greeting, $name!") } greet("Alice") // 输出:Hello, Alice! greet("Bob", "Hi") // 输出:Hi, Bob! -
命名参数:调用时指定参数名,提高可读性
kotlinfun createUser(name: String, age: Int, isAdmin: Boolean = false) { println("Name: $name, Age: $age, Admin: $isAdmin") } // 可以跳过有默认值的参数,随意调整顺序 createUser(age = 25, name = "Charlie", isAdmin = true) -
扩展函数:Kotlin 的"杀手级特性",可以为现有类添加新功能
kotlin// 为 String 类添加一个扩展函数 fun String.addExcitement(): String { return this + "!!!" } println("Kotlin is fun".addExcitement()) // 输出:Kotlin is fun!!! // 为 List 添加一个扩展函数 fun <T> List<T>.secondOrNull(): T? { return if (this.size >= 2) this[1] else null } val list = listOf("first", "second", "third") println(list.secondOrNull()) // 输出:second
十二、Lambda 表达式和高阶函数
这是函数式编程的核心,让代码极其简洁。
-
Lambda 表达式基础
kotlin// 一个简单的 Lambda:接收两个 Int 参数,返回它们的和 val sum: (Int, Int) -> Int = { a, b -> a + b } println(sum(3, 4)) // 输出:7 // 更常见的写法:直接传递给函数 val numbers = listOf(1, 2, 3, 4, 5) // 过滤出偶数 val evens = numbers.filter { it % 2 == 0 } // [2, 4] // 将每个元素乘以2 val doubled = numbers.map { it * 2 } // [2, 4, 6, 8, 10] // 排序 val sorted = numbers.sortedByDescending { it } // [5, 4, 3, 2, 1] -
高阶函数:接收函数作为参数或返回函数的函数
kotlin// 接收一个函数作为参数 fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int { return operation(a, b) } // 使用 Lambda 调用 val result1 = calculate(10, 5) { x, y -> x + y } // 15 val result2 = calculate(10, 5) { x, y -> x * y } // 50 // 返回一个函数 fun createMultiplier(factor: Int): (Int) -> Int { return { number -> number * factor } } val double = createMultiplier(2) val triple = createMultiplier(3) println(double(5)) // 输出:10 println(triple(5)) // 输出:15
十三、异常处理:try-catch 也是表达式
Kotlin 的 try-catch也可以返回值,这让错误处理更加函数式。
kotlin
fun parseNumber(str: String): Int? {
return try {
str.toInt() // 如果转换成功,返回数字
} catch (e: NumberFormatException) {
null // 如果转换失败,返回 null
}
}
println(parseNumber("123")) // 输出:123
println(parseNumber("abc")) // 输出:null
实战演练:综合运用
让我们用学到的知识解决一个实际问题:处理学生成绩列表。
kotlin
data class Student(val name: String, val score: Int)
fun main() {
val students = listOf(
Student("Alice", 85),
Student("Bob", 92),
Student("Charlie", 78),
Student("Diana", 95),
Student("Eve", 88)
)
// 找出成绩90分以上的学生名字
val topStudents = students
.filter { it.score > 90 }
.map { it.name }
println("Top students: $topStudents") // [Bob, Diana]
// 计算平均分
val averageScore = students.map { it.score }.average()
println("Average score: $averageScore")
// 按成绩降序排列
val sortedByScore = students.sortedByDescending { it.score }
sortedByScore.forEach { println("${it.name}: ${it.score}") }
// 使用扩展函数添加实用功能
fun List<Student>.getNames(): List<String> = this.map { it.name }
val allNames = students.getNames()
println("All names: $allNames")
}
下一步学习路径
现在你已经掌握了 Kotlin 的核心语法!接下来可以探索:
- 面向对象编程:类、对象、继承、接口、数据类、密封类
- 协程:Kotlin 的轻量级线程,用于异步编程
- DSL(领域特定语言) :用 Kotlin 创建优雅的领域特定语言
- 与 Java 互操作:在现有 Java 项目中引入 Kotlin
Kotlin 的学习曲线非常平滑,这些基础概念将为你后续的学习打下坚实的基础。尝试用 Kotlin 重写你之前用 Java 写过的小程序,你会立即感受到它的魅力!