我正在尝试学习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
}
答案 0 :(得分:5)
这两个函数有三个主要区别:
Kotlin有nullable types and non-null types。 {3}}可以在Kotlin代码中用作可空,Int?
或非空,Int
,并且在JVM上分别映射到Int
和Integer
int
可以使用表达式主体(与普通的块体相对)更简洁地声明。以下内容生成相同的字节码:
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
VS
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
答案 1 :(得分:2)
唯一的区别是返回类型:第一种情况为Int
,第二种情况为Int?
。
这种差异会以两种方式影响你:
1)在第二种情况下使用max
的代码无法知道它是否返回null
,因此每次都必须检查它(使用if-else
或其他技术)
2)第一种情况的基础字节代码(假设您使用JVM后端)使用原始int
,而不是框Integer
。这可以为您带来显着的性能提升。