协程与数据类——从 Java 到 Kotlin 的飞跃

知识库
知识库文档
/tech-stacks/kotlin/examples/协程与数据类——从 Java 到 Kotlin 的飞跃.md

文档

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%

信息

路径
/tech-stacks/kotlin/examples/协程与数据类——从 Java 到 Kotlin 的飞跃.md
更新时间
2026/5/31