Kotlin 函数基础 #

一、函数定义 #

1.1 基本语法 #

kotlin
fun functionName(param1: Type1, param2: Type2): ReturnType {
    // 函数体
    return result
}

1.2 简单函数 #

kotlin
fun greet() {
    println("Hello, Kotlin!")
}

// 调用
greet()

1.3 带参数的函数 #

kotlin
fun greet(name: String) {
    println("Hello, $name!")
}

greet("Kotlin")  // Hello, Kotlin!

1.4 带返回值的函数 #

kotlin
fun add(a: Int, b: Int): Int {
    return a + b
}

val sum = add(10, 20)  // 30

1.5 表达式体函数 #

当函数体只有一个表达式时,可以简化:

kotlin
// 完整形式
fun add(a: Int, b: Int): Int {
    return a + b
}

// 表达式体形式
fun add(a: Int, b: Int): Int = a + b

// 类型推断
fun add(a: Int, b: Int) = a + b

二、函数参数 #

2.1 位置参数 #

kotlin
fun createPerson(name: String, age: Int, city: String) {
    println("$name, $age years old, lives in $city")
}

createPerson("Kotlin", 10, "Beijing")

2.2 命名参数 #

使用命名参数提高可读性:

kotlin
createPerson(
    name = "Kotlin",
    age = 10,
    city = "Beijing"
)

// 顺序可以改变
createPerson(
    city = "Beijing",
    name = "Kotlin",
    age = 10
)

2.3 默认参数 #

kotlin
fun greet(name: String, greeting: String = "Hello") {
    println("$greeting, $name!")
}

greet("Kotlin")              // Hello, Kotlin!
greet("Kotlin", "Hi")        // Hi, Kotlin!
greet(name = "Kotlin", greeting = "Welcome")  // Welcome, Kotlin!

2.4 命名参数与默认参数结合 #

kotlin
fun createUser(
    name: String,
    age: Int = 0,
    email: String = "",
    isActive: Boolean = true
) {
    println("User: $name, $age, $email, $isActive")
}

// 只指定部分参数
createUser("Kotlin")
createUser("Kotlin", email = "kotlin@example.com")
createUser("Kotlin", isActive = false, age = 10)

三、可变参数 #

3.1 vararg 关键字 #

kotlin
fun sum(vararg numbers: Int): Int {
    return numbers.sum()
}

sum(1, 2, 3, 4, 5)  // 15
sum()               // 0

3.2 可变参数与其他参数 #

kotlin
fun format(prefix: String, vararg items: String, suffix: String): String {
    return "$prefix ${items.joinToString()} $suffix"
}

format("Start:", "A", "B", "C", suffix = "End")
// Start: A, B, C End

3.3 展开数组 #

使用 * 展开数组:

kotlin
val numbers = intArrayOf(1, 2, 3)
sum(*numbers)  // 6

val list = arrayOf("A", "B", "C")
format("Start:", *list, suffix = "End")

四、返回值 #

4.1 Unit 类型 #

没有返回值的函数返回 Unit

kotlin
fun printMessage(message: String): Unit {
    println(message)
}

// Unit 可以省略
fun printMessage(message: String) {
    println(message)
}

4.2 Nothing 类型 #

Nothing 表示永远不会返回:

kotlin
fun fail(message: String): Nothing {
    throw IllegalArgumentException(message)
}

fun infiniteLoop(): Nothing {
    while (true) {
        // 无限循环
    }
}

4.3 可空返回值 #

kotlin
fun findUser(id: Int): User? {
    return if (id > 0) User(id) else null
}

五、局部函数 #

5.1 函数内定义函数 #

kotlin
fun outerFunction(x: Int): Int {
    fun innerFunction(y: Int): Int {
        return x + y  // 可以访问外部变量
    }
    
    return innerFunction(10)
}

5.2 实际应用 #

kotlin
fun validateUser(user: User): Boolean {
    fun validateName(name: String): Boolean {
        return name.isNotBlank() && name.length <= 50
    }
    
    fun validateAge(age: Int): Boolean {
        return age in 0..150
    }
    
    return validateName(user.name) && validateAge(user.age)
}

六、尾递归函数 #

6.1 tailrec 关键字 #

kotlin
tailrec fun factorial(n: Int, acc: Int = 1): Int {
    return if (n <= 1) acc else factorial(n - 1, n * acc)
}

factorial(5)  // 120

6.2 尾递归条件 #

kotlin
// 正确:尾递归
tailrec fun sum(n: Int, acc: Int = 0): Int {
    return if (n <= 0) acc else sum(n - 1, acc + n)
}

// 错误:不是尾递归(递归调用后还有操作)
// tailrec fun factorial(n: Int): Int {
//     return if (n <= 1) 1 else n * factorial(n - 1)
// }

七、函数重载 #

7.1 基本重载 #

kotlin
fun add(a: Int, b: Int): Int = a + b
fun add(a: Double, b: Double): Double = a + b
fun add(a: Int, b: Int, c: Int): Int = a + b + c

7.2 默认参数替代重载 #

kotlin
// 使用重载
fun greet(name: String) = greet(name, "Hello")
fun greet(name: String, greeting: String) {
    println("$greeting, $name!")
}

// 使用默认参数(推荐)
fun greet(name: String, greeting: String = "Hello") {
    println("$greeting, $name!")
}

八、中缀函数 #

8.1 infix 关键字 #

kotlin
class Point(val x: Int, val y: Int) {
    infix fun plus(other: Point): Point {
        return Point(x + other.x, y + other.y)
    }
}

val p1 = Point(1, 2)
val p2 = Point(3, 4)

// 中缀调用
val p3 = p1 plus p2

// 普通调用
val p4 = p1.plus(p2)

8.2 内置中缀函数 #

kotlin
// until
1 until 10

// in
x in list

// to(创建 Pair)
"key" to "value"

// step
1..10 step 2

九、函数类型 #

9.1 函数类型声明 #

kotlin
// 函数类型
val add: (Int, Int) -> Int = { a, b -> a + b }

// 带接收者的函数类型
val greet: String.() -> String = { "Hello, $this" }

9.2 函数作为参数 #

kotlin
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

operate(10, 5) { x, y -> x + y }  // 15
operate(10, 5) { x, y -> x * y }  // 50

9.3 函数作为返回值 #

kotlin
fun getOperation(symbol: String): (Int, Int) -> Int {
    return when (symbol) {
        "+" -> { a, b -> a + b }
        "-" -> { a, b -> a - b }
        "*" -> { a, b -> a * b }
        "/" -> { a, b -> a / b }
        else -> { _, _ -> 0 }
    }
}

val add = getOperation("+")
add(10, 5)  // 15

十、实战示例 #

10.1 工具函数 #

kotlin
fun String.isEmail(): Boolean {
    return this.contains("@") && this.contains(".")
}

fun String.truncate(maxLength: Int): String {
    return if (length <= maxLength) this else take(maxLength) + "..."
}

// 使用
"test@example.com".isEmail()  // true
"Hello World".truncate(5)     // "Hello..."

10.2 构建器函数 #

kotlin
fun buildString(builderAction: StringBuilder.() -> Unit): String {
    val sb = StringBuilder()
    sb.builderAction()
    return sb.toString()
}

val result = buildString {
    append("Hello")
    append(", ")
    append("Kotlin")
}
// "Hello, Kotlin"

10.3 配置函数 #

kotlin
data class ServerConfig(
    var host: String = "localhost",
    var port: Int = 8080,
    var ssl: Boolean = false
)

fun server(config: ServerConfig.() -> Unit): ServerConfig {
    return ServerConfig().apply(config)
}

val config = server {
    host = "example.com"
    port = 443
    ssl = true
}

十一、最佳实践 #

11.1 函数命名 #

kotlin
// 推荐:动词开头
fun calculateTotal() { }
fun findUser() { }
fun validateInput() { }

// 布尔返回值用 is/has/can
fun isValid(): Boolean { }
fun hasPermission(): Boolean { }
fun canExecute(): Boolean { }

11.2 函数长度 #

kotlin
// 推荐:函数应该短小精悍
fun process(data: String): Result {
    val validated = validate(data)
    val transformed = transform(validated)
    return save(transformed)
}

// 不推荐:过长的函数
fun processAll(data: String): Result {
    // 100 行代码...
}

11.3 参数数量 #

kotlin
// 不推荐:参数过多
fun createUser(name: String, age: Int, email: String, 
               phone: String, address: String, city: String) { }

// 推荐:使用数据类
data class UserParams(
    val name: String,
    val age: Int,
    val email: String,
    val phone: String = "",
    val address: String = "",
    val city: String = ""
)

fun createUser(params: UserParams) { }

十二、总结 #

函数基础要点:

特性 说明
默认参数 减少函数重载
命名参数 提高可读性
可变参数 vararg 接收任意数量参数
表达式体 单表达式函数简化
尾递归 tailrec 优化递归
中缀函数 infix 提高可读性

下一步,让我们学习 Lambda表达式

最后更新:2026-03-27