在 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 |
返回计算结果 |
二、没有返回值的函数
如果函数没有返回值,可以使用 Unit。Unit 类似 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。
十七、高阶函数
如果一个函数满足下面任意一个条件,就叫高阶函数:
- 函数接收另一个函数作为参数。
- 函数返回另一个函数。
示例:
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() |
二十三、函数使用建议
开发中可以遵循以下建议:
- 一个函数只做一件事。
- 函数名要能表达函数的作用。
- 函数不要写得太长。
- 重复代码可以封装成函数。
- 没有必要修改外部状态时,尽量让函数只根据参数返回结果。
- Android 中可以把初始化界面、初始化数据、设置监听拆成不同函数。
- 优先使用清晰的函数名,而不是过度追求简短。
例如:
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 开发中,写好函数可以让代码结构更加清晰,也更方便后期维护。