表达式函数体指的是使用 =
号直接返回一个表达式结果的函数写法。
fun add(x: Int, y: Int): Int = x + y
这个函数的意思是:传入两个整数,返回它们的和。没有 return
关键字,也没有大括号 {}
,一切尽可能简洁。
: Int
)fun add(x: Int, y: Int): Int {
return x + y
}
代码块函数体是你更熟悉的传统写法:使用大括号 {}
包裹函数体,并通过 return
返回结果。
fun multiply(x: Int, y: Int): Int {
val result = x * y
return result
}
= ...
的场景:fun isEven(n: Int): Boolean = n % 2 == 0
fun double(n: Int) = n * 2
{ ... return ... }
的场景:fun max(a: Int, b: Int): Int {
println("Comparing $a and $b")
return if (a > b) a else b
}
Unit
(即无返回值):fun printHello() {
println("Hello")
}
(不能写成 fun printHello() = println("Hello")
吗?可以,但不推荐写成这样,容易误导阅读者认为它有返回值)
特性 | 表达式函数体 | 代码块函数体 |
---|---|---|
语法形式 | = 表达式 |
{ 语句 ... return ... } |
是否需要 return | ❌ 不需要 | ✅ 必须显式使用 return |
是否可以省略大括号 | ✅ 是的 | ❌ 不可以 |
是否适合多行逻辑 | ❌ 不适合 | ✅ 适合 |
是否适合调试 | ❌ 不适合(无法加日志等语句) | ✅ 适合 |
是否易读 | ✅ 简单时易读 | ✅ 复杂时更清晰 |
类型推断支持 | ✅ 自动推断或显式指定 | ✅ 自动推断或显式指定 |
使用场景 | 建议写法 |
---|---|
逻辑非常简单,仅一行 | 表达式函数体 |
需要中间变量或调试信息 | 代码块函数体 |
需要条件分支 / 循环等结构 | 代码块函数体 |
辅助函数 / 工具函数 | 表达式函数体 |
面向业务的主逻辑 | 代码块函数体 |
Kotlin 在表达式函数体中可以省略返回类型,比如:
fun square(x: Int) = x * x
等价于:
fun square(x: Int): Int = x * x
但是在代码块函数体中,如果你省略返回类型,编译器无法推断类型,会报错:
fun bad(x: Int) { // ❌ 错误!无法推断返回值类型
return x * 2
}
你必须明确指定返回类型:
fun good(x: Int): Int {
return x * 2
}
表达式函数体:轻巧快捷;代码块函数体:严谨灵活。
两种写法互为补充,按需使用,让代码既漂亮又实用!