文档
Kotlin 例程:协程、数据类与作用域函数
目标
对比 Java 冗长代码,展示 Kotlin 四大杀器:data class、扩展函数、协程、作用域函数。
完整代码
import kotlinx.coroutines.*
import java.time.LocalDateTime
// ── 1. data class:一行替代 Java 的 50 行 POJO ──
data class User(
val id: Long,
val name: String,
val email: String? = null, // 可空类型
val createdAt: LocalDateTime = LocalDateTime.now()
) {
val displayName: String
get() = name.uppercase()
}
// ── 2. 扩展函数:给 String 添加新方法 ──
fun String.isEmail(): Boolean =
this.matches(Regex("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$"))
// ── 3. 密封类:受限层次 + when 穷举 ──
sealed class Result<out T> {
data class Success<T>(val data: T) : Result<T>()
data class Error(val message: String) : Result<Nothing>()
object Loading : Result<Nothing>()
}
fun <T> Result<T>.getOrDefault(default: T): T = when (this) {
is Result.Success -> data
is Result.Error -> default
Result.Loading -> default
}
// ── 4. 协程:同步写法写异步 ──
suspend fun fetchUser(id: Long): User {
delay(1000) // 模拟网络请求,不阻塞线程
return User(id = id, name = "Alice")
}
// ── 5. 主函数 ──
fun main() = runBlocking {
// 作用域函数 let
val email = "alice@example.com"
email.let { e ->
println("${if (e.isEmail()) "✅" else "❌"} $e")
}
// 作用域函数 apply
val user = User(id = 1, name = "Bob").apply {
println("创建用户: $displayName")
}
// 协程并发
val deferred1 = async { fetchUser(1) }
val deferred2 = async { fetchUser(2) }
val users = listOf(deferred1.await(), deferred2.await())
users.forEach { println("获取到: ${it.name}") }
// 使用密封类
val result: Result<String> = Result.Success("数据加载成功")
println(result.getOrDefault("默认值"))
// when 表达式(不需要 break)
val grade = when (85) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
else -> "D"
}
println("成绩等级: $grade")
}
运行步骤
# build.gradle.kts 添加协程依赖
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
}
# 运行
gradle run
预期输出
✅ alice@example.com
创建用户: BOB
获取到: Alice
获取到: Alice
数据加载成功
成绩等级: B
Java vs Kotlin 对比
| Java | Kotlin | 代码行数减少 |
|---|---|---|
| POJO + getter/setter | data class |
~80% |
| try-catch null | ?. ?: |
~60% |
| CompletableFuture | 协程 async/await |
~50% |
| switch | when 表达式 |
~30% |