Kotlin 例程:协程、数据类与作用域函数
目标
对比 Java 冗长代码,展示 Kotlin 四大杀器:data class、扩展函数、协程、作用域函数。
完整代码
import kotlinx.coroutines.*
import java.time.LocalDateTime
data class User(
val id: Long,
val name: String,
val email: String? = null,
val createdAt: LocalDateTime = LocalDateTime.now()
) {
val displayName: String
get() = name.uppercase()
}
fun String.isEmail(): Boolean =
this.matches(Regex("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$"))
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
}
suspend fun fetchUser(id: Long): User {
delay(1000)
return User(id = id, name = "Alice")
}
fun main() = runBlocking {
val email = "alice@example.com"
email.let { e ->
println("${if (e.isEmail()) "✅" else "❌"} $e")
}
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("默认值"))
val grade = when (85) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
else -> "D"
}
println("成绩等级: $grade")
}
运行步骤
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% |