首页
/ Kotlin 函数详解:从基础到高级用法

Kotlin 函数详解:从基础到高级用法

2025-06-27 04:06:43作者:曹令琨Iris

作为 Kotlin 语言的核心特性之一,函数是每个开发者必须掌握的重要内容。本文将全面解析 Kotlin 函数的各种特性和用法,帮助您从基础到高级逐步掌握 Kotlin 函数的精髓。

函数基础语法

在 Kotlin 中,函数使用 fun 关键字声明:

fun double(x: Int): Int {
    return 2 * x
}

这种声明方式清晰明了,包含了函数名、参数列表和返回类型三个基本部分。

函数调用方式

Kotlin 支持多种函数调用方式:

  1. 标准调用:直接使用函数名和参数

    val result = double(2)
    
  2. 成员函数调用:使用点号表示法

    Stream().read() // 创建 Stream 实例并调用 read()
    

函数参数详解

参数声明

Kotlin 采用 Pascal 风格的参数声明方式 - 名称: 类型

fun powerOf(number: Int, exponent: Int): Int { /*...*/ }

尾随逗号

Kotlin 支持在参数列表末尾添加逗号,这在多行参数声明时特别有用:

fun powerOf(
    number: Int,
    exponent: Int, // 尾随逗号
) { /*...*/ }

默认参数值

Kotlin 的函数参数支持默认值,这大大减少了重载函数的数量:

fun read(
    b: ByteArray,
    off: Int = 0,
    len: Int = b.size,
) { /*...*/ }

默认值使用 = 在类型后指定。需要注意的是:

  1. 重写方法时必须省略默认参数值
  2. 默认参数后的非默认参数必须使用命名参数调用

命名参数

命名参数可以显著提高代码可读性,特别是在处理多个布尔参数或 null 值时:

reformat(
    "String!",
    false,
    upperCaseFirstLetter = false,
    divideByCamelHumps = true,
    '_'
)

使用命名参数时:

  • 可以任意调整参数顺序
  • 可以跳过有默认值的参数
  • 第一个命名参数后的所有参数都必须命名

特殊函数类型

Unit 返回类型

当函数不返回有用值时,返回类型为 Unit,可以省略:

fun printHello(name: String?) { /*...*/ }

单表达式函数

对于只包含单个表达式的函数,可以使用简写语法:

fun double(x: Int) = x * 2

编译器可以自动推断返回类型,使代码更加简洁。

可变数量参数(vararg)

使用 vararg 修饰符可以声明可变数量参数:

fun <T> asList(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts) // ts 是 Array 类型
        result.add(t)
    return result
}

调用时可以直接传递多个参数或使用展开运算符(*)传递数组:

val list1 = asList(1, 2, 3)
val a = arrayOf(4, 5, 6)
val list2 = asList(-1, 0, *a, 7)

中缀函数(Infix Notation)

标记为 infix 的函数可以使用中缀表示法调用:

infix fun Int.shl(x: Int): Int { /*...*/ }

// 中缀调用方式
1 shl 2
// 等价于
1.shl(2)

中缀函数必须满足:

  1. 是成员函数或扩展函数
  2. 只有一个参数
  3. 参数不能是 vararg 且不能有默认值

函数作用域

Kotlin 函数可以定义在多种作用域中:

顶层函数

不需要类容器,直接定义在文件中:

// 文件顶部直接定义
fun globalFunction() { /*...*/ }

局部函数

函数内部可以定义其他函数:

fun outerFunction() {
    fun innerFunction() { /*...*/ }
    innerFunction()
}

局部函数可以访问外部函数的局部变量(闭包)。

成员函数

定义在类或对象内部的函数:

class MyClass {
    fun memberFunction() { /*...*/ }
}

最佳实践建议

  1. 合理使用默认参数:减少重载函数数量,提高代码可维护性
  2. 善用命名参数:提高调用处的可读性,特别是布尔参数
  3. 考虑单表达式函数:简化简单函数的写法
  4. 谨慎使用 vararg:确保它确实提高了API的易用性
  5. 中缀函数命名:选择自然语言风格的名称,提高可读性

通过掌握这些函数特性和使用技巧,您可以编写出更加简洁、灵活且易于维护的 Kotlin 代码。

登录后查看全文
热门项目推荐