企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在Java、C语言中,return语句使我们再常见不过的了。虽然在Scala,Groovy这样的语言中,函数的返回值可以不需要显示用return来指定,但是我们仍然认为,使用return的编码风格更加容易阅读理解。 在Kotlin中,除了表达式的值,有返回值的函数都要求显式使用 return 来返回其值。 ~~~ fun main(args: Array<String>) { println(sum(1,2))//3 println(max(1,2))//2 println(sum2(1,2))//3 println(max2(1,2))//2 println(sumf(1,2))//() -> kotlin.Int println(maxf(1,2))//() -> kotlin.Int println(sumf(1,2).invoke())//3 println(maxf(1,2).invoke())//2 } fun sum(a:Int , b:Int):Int{ return a + b } fun max(a:Int,b: Int):Int{ if (a > b) return a else return b } //在Kotlin中,可以直接使用 = 符号来直接返回一个函数的值。 fun sum2(a: Int,b: Int) = a+b fun max2(a: Int,b: Int) = if (a>b) a else b //后面的函数体语句有没有大括号 {} 意思完全不同。加了大括号,意义就完全不一样了。 fun sumf(a: Int,b: Int) ={ a + b } fun maxf(a:Int, b:Int) = {if(a>b) a else b} ~~~ 从上面的代码以及返回值可以看出后面的函数体语句有没有大括号 {} 意思完全不同。加了大括号,意义就完全不一样了:sumf , maxf 的返回值是函数类型: ``` () -> kotlin.Int () -> kotlin.Int ``` #### Lambda表达式中的return kotlin 中 return 语句会从最近的函数或匿名函数中返回,但是在Lambda表达式中遇到return,则直接返回最近的外层函数。 示例 ~~~ fun main(args: Array<String>) { returnDemo_1() returnDemo_2() } fun returnDemo_1() { println(" START " + ::returnDemo_1.name) val intArray = intArrayOf(1, 2, 3, 4, 5) intArray.forEach { if (it == 3) return println(it) } println(" END " + ::returnDemo_2.name) } fun returnDemo_2() { println(" START " + ::returnDemo_2.name) val intArray = intArrayOf(1, 2, 3, 4, 5) intArray.forEach(fun(a: Int) { if (a == 3) return println(a) }) println(" END " + ::returnDemo_2.name) } ~~~ 运行结果 ``` START returnDemo_1 1 2 START returnDemo_2 1 2 4 5 END returnDemo_2 Process finished with exit code 0 ``` returnDemo_1 在遇到 3 时会直接返回(有点类似循环体中的 break 行为)。最后输出 ``` 1 2 ``` returnDemo_2 遇到 3 时会跳过它继续执行(有点类似循环体中的 continue 行为)。最后输出 ``` 1 2 4 5 ``` 在 returnDemo_2 中,我们用一个匿名函数替代 lambda 表达式。 匿名函数内部的 return 语句将从该匿名函数自身返回。 在Kotlin中,这是匿名函数和 lambda 表达式行为不一致的地方。当然,为了显式的指明 return返回的地址,为此 kotlin 还提供了 @Label (标签) 来控制返回语句,且看下节分解。