Kotlin 编程学习笔记

1. 变量与常量

使用 val 声明不可变的常量,var 声明可变变量。

val name = "Alice" // 不可更改
var age = 25         // 可更改

注意事项:修改 val 会导致编译错误。

2. 数据类型

Kotlin 是强类型语言,支持基础数据类型。

val height: Double = 1.75
val isStudent: Boolean = true

易错点:变量默认不可为 null,使用可空类型时需显式声明 String?

3. 条件语句

ifelse 是表达式,可以有返回值。

val max = if (a > b) a else b

注意事项:所有分支需返回一致类型。

4. 循环

Kotlin 支持 forwhiledo-while

for (i in 1..5) {
    println(i)
}

注意事项:使用 until 排除上限值。

5. 函数

使用 fun 定义函数,支持单表达式函数。

fun greet(name: String): String = "Hello, $name!"

注意事项:参数支持默认值,可省略调用。

6. 类与对象

类默认 final,使用 open 才能被继承。

open class Person(val name: String, var age: Int)

注意事项:构造函数可以在 init 块中初始化逻辑。

7. 扩展函数

扩展函数允许为已有类添加功能而不改变其源代码。

fun String.addHello() = "Hello $this"

注意事项:扩展函数无法修改原类,只能访问公开成员。

8. 泛型

泛型增强代码灵活性,允许在类和函数中使用类型参数。

fun  singletonList(item: T): List = listOf(item)

注意事项:泛型类型在运行时被擦除,无法检测类型。

9. 协程

协程为异步编程提供支持,简化回调处理。

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        delay(1000L)
        println("World!")
    }
    println("Hello")
}

注意事项:适当使用 runBlockinglaunch 控制协程作用域。

10. 错误处理

使用 try-catch 进行错误捕获,支持 finally 块。

try {
    val result = riskyFunction()
} catch (e: Exception) {
    println("Error: ${e.message}")
}

注意事项:捕获具体异常以便定位问题。

高级与小众用法

数据类中的解构声明

数据类可以直接解构为多个变量。

data class User(val name: String, val age: Int)
val user = User("Alice", 25)
val (name, age) = user

易错点:解构声明顺序必须与类定义顺序一致。

Elvis 操作符

用于空安全操作,指定默认值。

val name: String? = null
val displayName = name ?: "Unknown"

易错点:使用过多 ?: 可能隐藏 null 检查问题。

Infix 函数

一种不使用圆括号的调用方式。

infix fun Int.times(str: String) = str.repeat(this)
println(3 times "Hello ")

注意事项:Infix 函数只能接收一个参数,需保证可读性。

高阶函数与 Lambda

以函数作为参数或返回值。

val list = listOf(1, 2, 3, 4)
val doubled = list.map { it * 2 }

易错点:避免在性能敏感的地方使用频繁创建对象的 Lambda。

对象表达式与单例

使用 object 创建单例。

object Singleton {
    val name = "OnlyInstance"
}
println(Singleton.name)

注意事项:对象表达式默认线程安全,适用于全局资源。

型变与协变、逆变

定义泛型的协变和逆变。

class Box(val value: T)

注意事项:协变只允许使用类型为输出,逆变用于输入参数。

属性委托 (Delegates)

使用 lazyobservable 进行延迟初始化和属性观察。

val lazyValue: String by lazy {
    println("Computed!")
    "Hello"
}
println(lazyValue)

注意事项:by lazy 仅在首次访问时计算,适用于单例模式。