Kotlin函数详解与使用示例

在 Kotlin 中,函数是非常核心的语法。无论是普通业务逻辑、Android 点击事件、Activity 生命周期、工具方法,还是后续学习协程、Compose、扩展函数,都会大量使用函数。

Kotlin 中使用 fun 关键字定义函数。


一、函数的基本定义

Kotlin 定义函数的基本格式如下:

kotlin 复制代码
fun 函数名(参数名: 参数类型): 返回值类型 {
    函数体
    return 返回值
}

示例:

kotlin 复制代码
fun add(a: Int, b: Int): Int {
    return a + b
}

调用函数:

kotlin 复制代码
val result = add(10, 20)
println(result)

输出结果:

text 复制代码
30
组成部分 说明
fun 定义函数的关键字
add 函数名
a: Int, b: Int 函数参数
: Int 返回值类型
return a + b 返回计算结果

二、没有返回值的函数

如果函数没有返回值,可以使用 UnitUnit 类似 Java 中的 void

kotlin 复制代码
fun sayHello(): Unit {
    println("Hello Kotlin")
}

不过在 Kotlin 中,Unit 一般可以省略:

kotlin 复制代码
fun sayHello() {
    println("Hello Kotlin")
}

调用:

kotlin 复制代码
sayHello()

输出:

text 复制代码
Hello Kotlin

Android 中很常见,例如:

kotlin 复制代码
fun showMessage() {
    Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show()
}

三、有参数的函数

函数可以接收参数。

kotlin 复制代码
fun greet(name: String) {
    println("你好,$name")
}

调用:

kotlin 复制代码
greet("张三")

输出:

text 复制代码
你好,张三

多个参数:

kotlin 复制代码
fun showUserInfo(name: String, age: Int) {
    println("姓名:$name,年龄:$age")
}

调用:

kotlin 复制代码
showUserInfo("李四", 20)

四、有返回值的函数

如果函数需要返回结果,需要在参数列表后面写返回值类型。

kotlin 复制代码
fun getUserName(): String {
    return "张三"
}

调用:

kotlin 复制代码
val name = getUserName()
println(name)

返回整数:

kotlin 复制代码
fun getAge(): Int {
    return 18
}

返回布尔值:

kotlin 复制代码
fun isLogin(): Boolean {
    return true
}

Android 示例:

kotlin 复制代码
fun isPasswordValid(password: String): Boolean {
    return password.length >= 6
}

使用:

kotlin 复制代码
val password = "123456"

if (isPasswordValid(password)) {
    println("密码合法")
} else {
    println("密码长度不能少于 6 位")
}

五、表达式函数

如果函数体只有一行代码,可以使用表达式函数写法。

普通写法:

kotlin 复制代码
fun add(a: Int, b: Int): Int {
    return a + b
}

简化写法:

kotlin 复制代码
fun add(a: Int, b: Int): Int = a + b

还可以省略返回值类型,因为 Kotlin 可以自动推断:

kotlin 复制代码
fun add(a: Int, b: Int) = a + b

字符串示例:

kotlin 复制代码
fun getWelcomeText(name: String) = "欢迎你,$name"

调用:

kotlin 复制代码
val text = getWelcomeText("张三")
println(text)

输出:

text 复制代码
欢迎你,张三

六、默认参数

Kotlin 支持默认参数。也就是说,定义函数时可以给参数设置默认值。

kotlin 复制代码
fun greet(name: String = "游客") {
    println("你好,$name")
}

调用时可以传参:

kotlin 复制代码
greet("张三")

也可以不传参:

kotlin 复制代码
greet()

Android 中也可以这样写:

kotlin 复制代码
fun showToast(message: String = "操作成功") {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

调用:

kotlin 复制代码
showToast("登录成功")
showToast()

七、命名参数

Kotlin 支持命名参数。调用函数时,可以明确写出参数名。

kotlin 复制代码
fun showUserInfo(name: String, age: Int, city: String) {
    println("姓名:$name,年龄:$age,城市:$city")
}

普通调用:

kotlin 复制代码
showUserInfo("张三", 18, "北京")

命名参数调用:

kotlin 复制代码
showUserInfo(name = "张三", age = 18, city = "北京")

命名参数的好处是代码更清晰,尤其是参数比较多时。

还可以调整参数顺序:

kotlin 复制代码
showUserInfo(city = "北京", age = 18, name = "张三")

八、默认参数和命名参数结合使用

kotlin 复制代码
fun createUser(
    name: String,
    age: Int = 18,
    city: String = "未知"
) {
    println("姓名:$name,年龄:$age,城市:$city")
}

调用:

kotlin 复制代码
createUser(name = "张三")

输出:

text 复制代码
姓名:张三,年龄:18,城市:未知

也可以只修改其中一个默认参数:

kotlin 复制代码
createUser(name = "李四", city = "上海")

输出:

text 复制代码
姓名:李四,年龄:18,城市:上海

这种写法在 Android 开发中很常用,可以减少重载方法的数量。


九、可空参数

Kotlin 默认参数不能为 null

kotlin 复制代码
fun printName(name: String) {
    println(name)
}

下面这样调用会报错:

kotlin 复制代码
printName(null) // 错误

如果参数允许为空,需要在类型后面加 ?

kotlin 复制代码
fun printName(name: String?) {
    println(name)
}

调用:

kotlin 复制代码
printName(null)

可空参数使用时通常要做空判断:

kotlin 复制代码
fun printName(name: String?) {
    if (name != null) {
        println(name.length)
    } else {
        println("name 为空")
    }
}

也可以使用安全调用:

kotlin 复制代码
fun printName(name: String?) {
    println(name?.length)
}

Android 示例:

kotlin 复制代码
fun setTitleText(title: String?) {
    textView.text = title ?: "默认标题"
}

这里的 ?: 是 Elvis 操作符,表示如果 title 为空,就使用 "默认标题"


十、函数返回可空类型

函数的返回值也可以是可空类型。

kotlin 复制代码
fun getUserName(): String? {
    return null
}

使用时需要注意空安全:

kotlin 复制代码
val name = getUserName()
println(name?.length)

也可以设置默认值:

kotlin 复制代码
val name = getUserName() ?: "默认用户"
println(name)

Android 示例:

kotlin 复制代码
fun getInputText(): String? {
    val text = editText.text.toString()
    return if (text.isBlank()) {
        null
    } else {
        text
    }
}

十一、局部函数

Kotlin 支持在函数内部定义函数,这种函数叫局部函数。

kotlin 复制代码
fun login(username: String, password: String) {

    fun checkInput(): Boolean {
        return username.isNotBlank() && password.isNotBlank()
    }

    if (checkInput()) {
        println("开始登录")
    } else {
        println("用户名或密码不能为空")
    }
}

局部函数适合封装只在当前函数内部使用的小逻辑。


十二、成员函数

定义在类中的函数叫成员函数。

kotlin 复制代码
class User {

    fun login() {
        println("用户登录")
    }

    fun logout() {
        println("用户退出")
    }
}

调用:

kotlin 复制代码
val user = User()
user.login()
user.logout()

Android 中的 Activity 里定义的方法就是成员函数:

kotlin 复制代码
class MainActivity : AppCompatActivity() {

    fun initView() {
        println("初始化界面")
    }

    fun initData() {
        println("初始化数据")
    }
}

十三、顶层函数

Kotlin 支持顶层函数。也就是说,函数可以不写在类里面。

kotlin 复制代码
fun formatTime(time: Long): String {
    return "$time ms"
}

这种函数可以直接定义在 .kt 文件中。

例如创建一个工具文件:

kotlin 复制代码
// FileUtils.kt

fun getFileName(path: String): String {
    return path.substringAfterLast("/")
}

使用:

kotlin 复制代码
val fileName = getFileName("/sdcard/test.txt")
println(fileName)

输出:

text 复制代码
test.txt

顶层函数很适合写工具方法。


十四、扩展函数

扩展函数是 Kotlin 非常常用的特性。它可以在不修改原类代码的情况下,给已有类型添加新的函数。

基本格式:

kotlin 复制代码
fun 类型.函数名() {
    函数体
}

示例:给 String 添加一个判断是否是手机号的函数。

kotlin 复制代码
fun String.isPhoneNumber(): Boolean {
    return this.length == 11
}

调用:

kotlin 复制代码
val phone = "13800138000"

if (phone.isPhoneNumber()) {
    println("手机号格式正确")
}

这里的 this 表示当前调用这个函数的字符串对象。

Android 中常见扩展函数:

kotlin 复制代码
fun Context.showToast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

在 Activity 中调用:

kotlin 复制代码
showToast("保存成功")

也可以给 View 添加扩展函数:

kotlin 复制代码
fun View.visible() {
    visibility = View.VISIBLE
}

fun View.gone() {
    visibility = View.GONE
}

使用:

kotlin 复制代码
progressBar.visible()
textView.gone()

扩展函数可以让 Android 代码更简洁。


十五、函数作为参数

Kotlin 中函数可以作为参数传递。这也是后续学习 Lambda、回调、协程、Compose 的基础。

示例:

kotlin 复制代码
fun doSomething(action: () -> Unit) {
    action()
}

调用:

kotlin 复制代码
doSomething {
    println("执行任务")
}

这里的 () -> Unit 表示:

text 复制代码
没有参数,没有返回值的函数类型

再看一个带参数的函数类型:

kotlin 复制代码
fun calculate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
    return operation(a, b)
}

调用:

kotlin 复制代码
val result = calculate(10, 20) { x, y ->
    x + y
}

println(result)

输出:

text 复制代码
30

十六、Lambda 表达式

Lambda 可以理解为匿名函数。

普通函数:

kotlin 复制代码
fun add(a: Int, b: Int): Int {
    return a + b
}

Lambda 写法:

kotlin 复制代码
val add = { a: Int, b: Int ->
    a + b
}

调用:

kotlin 复制代码
val result = add(10, 20)
println(result)

Android 点击事件中经常使用 Lambda:

kotlin 复制代码
button.setOnClickListener {
    Toast.makeText(this, "按钮被点击了", Toast.LENGTH_SHORT).show()
}

这其实就是把一段函数逻辑传给了 setOnClickListener


十七、高阶函数

如果一个函数满足下面任意一个条件,就叫高阶函数:

  1. 函数接收另一个函数作为参数。
  2. 函数返回另一个函数。

示例:

kotlin 复制代码
fun repeatTask(times: Int, task: () -> Unit) {
    for (i in 1..times) {
        task()
    }
}

调用:

kotlin 复制代码
repeatTask(3) {
    println("执行任务")
}

输出:

text 复制代码
执行任务
执行任务
执行任务

Android 中可以用高阶函数封装点击事件:

kotlin 复制代码
fun View.onClick(action: () -> Unit) {
    setOnClickListener {
        action()
    }
}

使用:

kotlin 复制代码
button.onClick {
    showToast("点击了按钮")
}

十八、匿名函数

除了 Lambda,Kotlin 也支持匿名函数。

kotlin 复制代码
val add = fun(a: Int, b: Int): Int {
    return a + b
}

调用:

kotlin 复制代码
val result = add(10, 20)
println(result)

匿名函数一般没有 Lambda 常用,但在需要明确返回类型或复杂逻辑时也可以使用。


十九、递归函数

函数可以调用自己,这种函数叫递归函数。

示例:计算阶乘。

kotlin 复制代码
fun factorial(n: Int): Int {
    return if (n == 1) {
        1
    } else {
        n * factorial(n - 1)
    }
}

调用:

kotlin 复制代码
val result = factorial(5)
println(result)

输出:

text 复制代码
120

递归使用时要注意必须有结束条件,否则会造成死循环或栈溢出。


二十、Android 中常见函数使用场景

1. 初始化界面

kotlin 复制代码
fun initView() {
    titleTextView.text = "首页"
    progressBar.visibility = View.GONE
}

2. 初始化数据

kotlin 复制代码
fun initData() {
    val list = listOf("Kotlin", "Android", "Jetpack")
    println(list)
}

3. 设置点击事件

kotlin 复制代码
fun initListener() {
    loginButton.setOnClickListener {
        login()
    }
}

4. 登录逻辑

kotlin 复制代码
fun login() {
    val username = usernameEditText.text.toString()
    val password = passwordEditText.text.toString()

    if (username.isBlank() || password.isBlank()) {
        showToast("用户名或密码不能为空")
        return
    }

    showToast("开始登录")
}

5. Toast 提示

kotlin 复制代码
fun showToast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

6. 表单校验

kotlin 复制代码
fun checkInput(username: String, password: String): Boolean {
    return username.isNotBlank() && password.length >= 6
}

二十一、完整 Android 示例

下面是一个简单的 Android Kotlin 函数使用示例:

kotlin 复制代码
class MainActivity : AppCompatActivity() {

    private lateinit var usernameEditText: EditText
    private lateinit var passwordEditText: EditText
    private lateinit var loginButton: Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initView()
        initListener()
    }

    private fun initView() {
        usernameEditText = findViewById(R.id.usernameEditText)
        passwordEditText = findViewById(R.id.passwordEditText)
        loginButton = findViewById(R.id.loginButton)
    }

    private fun initListener() {
        loginButton.setOnClickListener {
            login()
        }
    }

    private fun login() {
        val username = usernameEditText.text.toString()
        val password = passwordEditText.text.toString()

        if (!checkInput(username, password)) {
            showToast("用户名或密码不能为空,密码不能少于 6 位")
            return
        }

        showToast("登录成功")
    }

    private fun checkInput(username: String, password: String): Boolean {
        return username.isNotBlank() && password.length >= 6
    }

    private fun showToast(message: String) {
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
    }
}

这个例子中用到了多个函数:

函数名 作用
onCreate() Activity 生命周期方法
initView() 初始化控件
initListener() 设置点击事件
login() 处理登录逻辑
checkInput() 校验输入内容
showToast() 显示提示信息

二十二、函数命名建议

函数名一般使用小驼峰命名法。

正确示例:

kotlin 复制代码
fun getUserName() {}
fun showToast() {}
fun checkInput() {}
fun initView() {}
fun loadUserData() {}

不推荐:

kotlin 复制代码
fun GetUserName() {}
fun show_toast() {}
fun CHECKINPUT() {}

常见命名方式:

场景 推荐命名
获取数据 getUserInfo()
加载数据 loadData()
初始化界面 initView()
初始化监听 initListener()
显示提示 showToast()
检查输入 checkInput()
保存数据 saveUserInfo()
删除数据 deleteUser()
更新界面 updateUI()

二十三、函数使用建议

开发中可以遵循以下建议:

  1. 一个函数只做一件事。
  2. 函数名要能表达函数的作用。
  3. 函数不要写得太长。
  4. 重复代码可以封装成函数。
  5. 没有必要修改外部状态时,尽量让函数只根据参数返回结果。
  6. Android 中可以把初始化界面、初始化数据、设置监听拆成不同函数。
  7. 优先使用清晰的函数名,而不是过度追求简短。

例如:

kotlin 复制代码
fun initView() {
    // 初始化界面
}

fun initData() {
    // 初始化数据
}

fun initListener() {
    // 设置监听事件
}

比所有代码都写在 onCreate() 中更清晰。


二十四、总结

Kotlin 中使用 fun 定义函数。

基本格式:

kotlin 复制代码
fun 函数名(参数名: 参数类型): 返回值类型 {
    函数体
    return 返回值
}

常见函数类型包括:

函数类型 示例
无参数无返回值函数 fun sayHello()
有参数函数 fun greet(name: String)
有返回值函数 fun add(a: Int, b: Int): Int
表达式函数 fun add(a: Int, b: Int) = a + b
默认参数函数 fun greet(name: String = "游客")
可空参数函数 fun printName(name: String?)
扩展函数 fun Context.showToast(message: String)
高阶函数 fun doSomething(action: () -> Unit)

对于 Android Kotlin 开发来说,函数主要用于:

text 复制代码
封装逻辑、减少重复代码、提高代码可读性、拆分 Activity/Fragment 中的业务流程。

初学时重点掌握:

kotlin 复制代码
fun sayHello() {
    println("Hello Kotlin")
}

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

fun showToast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}

最后记住一句话:

text 复制代码
函数的作用,就是把一段可以复用的代码封装起来。

在 Android 开发中,写好函数可以让代码结构更加清晰,也更方便后期维护。

相关推荐
阿pin3 小时前
Android随笔-Zygote中fork究竟是什么?
android·zygote·fork
Go-higher3 小时前
DriverTest 驾考知识卡片学习助手 —— 一款基于 Jetpack Compose 的现代 Android 学习APP
android·学习
安卓修改大师4 小时前
安卓修改大师APK控件修改实战教程
android
阿pin4 小时前
Android随笔-Zygote是什么?
android·zygote
小虎牙0074 小时前
Android kotlin图片库Coil源码详解
android·前端
AFinalStone5 小时前
Android 7系统网络(一)全景图与调用链路概览
android·网络·frameworks
用户86022504674725 小时前
Android DEX 内存 Dump 全流程实战:从 APK 提取到无特征内存盲扫
android
Android-Flutter8 小时前
android compose Brush 渐变和着色器 使用
android·kotlin·compose
杉氧8 小时前
兼容与共生:如何在旧项目中优雅地引入 Compose?
android·架构·android jetpack
Flynt9 小时前
Room 3.0 包名重构 + KMP 迁移:我把项目升级踩了个遍
android·数据库·kotlin