Kotlin编程基础知识

时间:2017-04-12 07:33:52

标签: 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
}

2 个答案:

答案 0 :(得分:5)

这两个函数有三个主要区别:

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

    Kotlin有nullable types and non-null types。 {3}}可以在Kotlin代码中用作可空,Int?或非空,Int,并且在JVM上分别映射到IntInteger

    体型

    Kotlin中的

    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。这可以为您带来显着的性能提升。