函数与 Lambda
扩展函数、高阶函数、尾递归。
35 分钟
函数与 Lambda
Kotlin 中函数是一等公民:默认参数、命名参数、扩展函数、高阶函数与尾递归都是语言内置特性,比 Java 8 Lambda 更自然。
学习目标
- 掌握函数声明、默认参数与命名参数
- 理解 Lambda、高阶函数与函数类型
- 会使用扩展函数与尾递归
tailrec
函数基础
fun greet(name: String, prefix: String = "Hello"): String {
return "$prefix, $name!"
}
fun createLesson(slug: String, title: String, order: Int = 0): String {
return "[$order] $slug: $title"
}
fun main() {
println(greet("CodeRoadMap"))
println(greet("Kotlin", prefix = "Hi"))
println(createLesson("kt-intro", "Kotlin 是什么"))
println(createLesson("kt-syntax", "基础语法", order = 2))
}
默认参数减少重载;命名参数提高可读性,可跳过中间参数。
Lambda 与高阶函数
fun filterLessons(
slugs: List<String>,
predicate: (String) -> Boolean
): List<String> = slugs.filter(predicate)
fun main() {
val slugs = listOf("kt-intro", "kt-syntax", "kt-control", "java-intro")
// Lambda 写法
val kotlinOnly = filterLessons(slugs) { it.startsWith("kt-") }
println(kotlinOnly)
// 函数引用
val longSlugs = slugs.filter(String::isNotEmpty)
.filter { it.length > 8 }
println(longSlugs)
// 高阶函数:map / fold
val titles = slugs.map { it.replace("-", " ").replaceFirstChar { c -> c.uppercase() } }
val totalLen = slugs.fold(0) { acc, s -> acc + s.length }
println(titles)
println("总字符数: $totalLen")
}
(String) -> Boolean 是函数类型;it 是单参数 Lambda 的隐式名。
扩展函数
fun String.slugToTitle(): String =
split("-").joinToString(" ") { word ->
word.replaceFirstChar { it.uppercase() }
}
fun List<String>.kotlinLessons(): List<String> =
filter { it.startsWith("kt-") }
fun main() {
val slug = "kotlin-essentials"
println(slug.slugToTitle())
val all = listOf("kt-intro", "java-intro", "kt-syntax")
println(all.kotlinLessons())
}
扩展函数不修改原类,编译为静态方法,JVM 上与 Java 工具类等价。
尾递归
tailrec fun factorial(n: Int, acc: Int = 1): Int {
return if (n <= 1) acc else factorial(n - 1, acc * n)
}
fun main() {
println(factorial(5)) // 120
}
tailrec 要求递归调用是函数最后一行,编译器优化为循环,避免栈溢出。