🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### Kotlin相比于Java | 相比于java | 描述                  | | ------- | ------------------- | | 新增      | 表达式函数可以去掉方法大括号,代码更清爽 | ### 表达式函数体 #### **转换为表达式函数体** 说到函数,还记得我们前面讲过的4种函数类型吧?“**函数一共就有4种类型,无参无返回值、无参有返回值、有参无返回值、有参有返回值**”。参考代码: ~~~ //无参无返回值 fun myFun1() {     println("outerFun") }   //无参有返回值 fun myFun2(): String {     return"innerFun" }   //有参无返回值 fun myFun3(content: String) {    println(content) }   //有参有返回值 fun myFun4(content: String): String {     return content } 当然,没有返回值的函数,也可以明确指定返回值类型为Unit。 //无参无返回值 fun myFun1():Unit{     println("outerFun") }   //有参无返回值 fun myFun3(content: String) :Unit {     println(content) } ~~~ 针对上面的4个方法,我们把鼠标放到代码第3行,函数体里面的【println("outerFun") 】,然后按alt+Enter快捷键,就会看到如下提示,参考截图: ![](https://box.kancloud.cn/1514f2d9eb8717f677d6c6e2df5d8884_633x223.gif) 我们选中`“Convert to expression body”`,对4个方法进行转换,得到如下结果如下 ![](https://box.kancloud.cn/275784e8f384c7536c905e7127fac4d4_685x379.png) #### **表达式函数体定义** 那什么是表达式函数体呢?现在应该已经很明白了,就是**函数体之前放在大括号里面,现在可以放在等号右边**。 是不是所有的函数都能用表达式函数体呢?不是。**函数体只有一行代码的时候,才能用表达式函数体**。上面的4个函数正好都能转换为表达式函数体,不过是碰巧上面4个方法的函数体内容就只有一行。**如果方法体不止一行,就没法转换为表达式函数体**,参考代码: ![](https://box.kancloud.cn/b9542eaa39208bbf05e69f12b90564ae_682x169.png) 我们发现,这个时候就没有`“Convert to expression body”`提示了。 #### **表达式函数体作用** 表达式函数体作用是什么呢? 1. 针对函数体只有一行代码的情况,多了一种表达形式。 2. 针对函数体只有一行代码的情况,代码显得更加清爽,没有了大括号。 3. 表达式函数体支持返回类型自动推断。显得比较智能。 针对第3点优点,参考代码: ![](https://box.kancloud.cn/0cc42d8cd05d4a0b94ff17c73fa4d769_690x193.png) 上面2个方法都是编译通过的。 所以,【**Kotlin相比于Java,使用表达式函数体,简化函数方法体只有一行代码情况下函数的定义**】 ### 单表达式函数 当函数返回单个表达式时,可以省略花括号并且在`=`符号之后指定代码体即可: ``` fun double(x: Int): Int = x * 2 ``` 当返回值类型可由编译器推断时,显式声明返回类型是[可选](http://www.kotlincn.net/docs/reference/functions.html#显式返回类型)的: ``` fun double(x: Int) = x * 2 ``` * [ ] **为什么有些函数可以不声明返回类型**? 作为一门静态类型语言, Kotlin 不是要求每个表达式都应该在编译期具有类型吗?事实上,每个变量和表达式都有类型,每个函数都有返回类型。但是**对表达式体函数来说,编译器会分析作为函数体的表达式,并把它的类型作为函数的返回类型,即使没有显式地写出来。这种分析通常被称作类型推导。** >[danger]注意,只有表达式体函数的返回类型可以省略。对于有返回值的代码块体函数,必须显式地写出返回类型和return 语句。这是刻意的选择。真实项目中的函数一般很长且可以包含多条return 语句,显式地写出返回类型和return 语句能帮助你快速地理解函数能返回的是什么。