首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin编程基础

Kotlin编程基础
EN

Stack Overflow用户
提问于 2017-04-12 07:33:51
回答 2查看 186关注 0票数 0

我试图学习Kotlin和我带了一个问题,同时使用函数。

代码语言:javascript
复制
fun main(args: Array<String>) {
    println(max(20, 10))
}

fun max(a: Int, b: Int) = if (a > b) a else b

我有一个函数麦克斯。现在,上述实现与函数MAX的实现之间是否有任何区别,尽管两者提供了相同的输出。

代码语言:javascript
复制
fun max(a: Int, b: Int): Int?{
    if(a > b)
        return a
    else
        return b
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-12 13:58:06

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

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

返回类型

科特林有可空类型和非空类型Int可以在Kotlin代码中作为可空、Int?或非空、Int和JVM分别映射到Integerint

身体风格

Kotlin中的单表达式函数可以使用表达式体(相对于普通块体)更简洁地声明。以下代码生成相同的字节码:

表现性体裁

代码语言:javascript
复制
fun max(a: Int, b: Int) = if (a > b) a else b

还可以显式声明返回类型:

代码语言:javascript
复制
fun max(a: Int, b: Int): Int = if (a > b) a else b

块体式

代码语言:javascript
复制
fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

字节码

第一个函数的字节码根据条件加载值,然后返回加载的值,而第二个函数的字节码声明两个块,每个块定义自己的加载和返回,从而生成更多的字节码。

代码语言:javascript
复制
   L0
    LINENUMBER 8 L0
    ILOAD 0
    ILOAD 1
    IF_ICMPLE L1
    ILOAD 0
    GOTO L2
   L1
    ILOAD 1
   L2
    IRETURN

代码语言:javascript
复制
   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
票数 5
EN

Stack Overflow用户

发布于 2017-04-12 07:52:03

唯一的区别是返回类型:第一种情况是Int,第二种情况是Int?

这种差异对你有两个方面的影响:

1)在第二种情况下使用max的代码无法知道它是否返回null,因此它必须每次检查(使用if-else或其他技术)。

2)第一种情况下的底层字节码(假设您使用JVM后端)使用原始的int,而不是装箱的Integer。这可以给你一个显著的性能提升。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43363161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档