Kotlin编程基础
我正在努力学习Kotlin,并且在使用函数的时候遇到了一个问题。
fun main(args: Array<String>) { println(max(20, 10)) } fun max(a: Int, b: Int) = if (a > b) a else b
在这里我有一个函数MAX。 现在在函数MAX的上面的实现和下面的实现之间有什么区别,虽然都给出了相同的输出。
fun max(a: Int, b: Int): Int?{ if(a > b) return a else return b }
这两个功能之间有三个主要区别:
- 返回类型是不同的(正如voddan指出的那样)。
- 身体风格是不同的(这只是语法糖)。
- 第一个函数的字节码更高效。
返回类型
Kotlin具有可空类型和非空类型 。 Int
可以在Kotlin代码中使用为空, Int?
,或者非null, Int
,并且在JVM上分别映射到Integer
和int
。
身体的风格
Kotlin中的单表达式函数可以使用表达式体(与正常的块体相反)更简洁地声明。 以下生成相同的字节码:
表现体型
fun max(a: Int, b: Int) = if (a > b) a else b
返回类型也可以显式声明:
fun max(a: Int, b: Int): Int = if (a > b) a else b
块体风格
fun max(a: Int, b: Int): Int { return if (a > b) a else b }
字节码
第一个函数的字节码根据条件加载值,然后返回加载的值,而第二个函数的字节码声明两个块,每个块定义它自己的加载和返回,从而产生更多的字节码。
L0 LINENUMBER 8 L0 ILOAD 0 ILOAD 1 IF_ICMPLE L1 ILOAD 0 GOTO L2 L1 ILOAD 1 L2 IRETURN
与
L0 LINENUMBER 8 L0 ILOAD 0 ILOAD 1 IF_ICMPLE L1 L2 LINENUMBER 9 L2 ILOAD 0 IRETURN L3 L1 LINENUMBER 11 L1 ILOAD 1 IRETURN
唯一的区别是返回类型:在第一种情况下是Int
,而Int?
在第二种情况下。
这种差异会以两种方式影响你:
1)在第二种情况下使用max
的代码不知道它是否返回null
,所以它必须每次检查它(使用if-else
或其他技术)
2)第一种情况的底层字节代码(假设你使用JVM后端)使用原始的int
,而不是盒装的Integer
。 这可以给你一个显着的性能提升。