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 } 

这两个功能之间有三个主要区别:

  1. 返回类型是不同的(正如voddan指出的那样)。
  2. 身体风格是不同的(这只是语法糖)。
  3. 第一个函数的字节码更高效。

返回类型

Kotlin具有可空类型和非空类型 。 Int可以在Kotlin代码中使用为空, Int? ,或者非null, Int ,并且在JVM上分别映射到Integerint

身体的风格

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 。 这可以给你一个显着的性能提升。