zoukankan      html  css  js  c++  java
  • Kotlin函数与Lambda表达式深入

    Kotlin函数:

    关于Kotlin函数在之前也一直在用,用fun来声明,回忆下:

    下面再来整体对Kotlin的函数进行一个学习。

    默认参数(default arguments):

    先来定义一个函数:

    相比java不一样的就是可以给参数增加默认参数,如下:

    接一来调用一下该函数:

    接下来还可以这样调用:

     运行一下:

    不过还有一个显示指定参数的方式,这样可读性比较强:

    当然还可以都传啦:

    其中上面调用两个参数的这个写法可以简化为:

    当然还可以正常的调用:

    可见相比Java,Kotlin对于函数提供了更加灵活的特性。

    重写方法默认值:

    情况一:

    先来说下结论:“对于重写的方法来说,子类所拥有的重写方法会使用与父类相同的默认参数值。在重写一个拥有默认参数值的方法时,方法签名中必须要将默认参数值省略掉。” 啥意思,下面用代码来进行说明:

    先定义一个父类:

    再定义其子类:

    其中来理解一下刚才说的话:“对于重写的方法来说,子类所拥有的重写方法会使用与父类相同的默认参数值。”,也就是说对于子类重写了父类的方法,而对于参数b在父类中是有默认值的,对于子类来说也会有相同的默认值,那我能否给子类的b显示的指定一个默认值呢,咱们试一下:

    这就应证了另外一句话:“在重写一个拥有默认参数值的方法时,方法签名中必须要将默认参数值省略掉。”,好下面来调用一下:

    情况二:

    先来看下说明:“如果一个默认参数位于其它无默认值的参数前面,那么默认值只能通过在调用函数时使用具名参数【named argument,也就是显示的指定参数名】的方式来使用。”,下面定义一个函数:

    假如我们不显示指定参数名呢?

    Lambda表达式:

    对于Kotlin的Lambda表达式跟Java8其实差不多,不过也有它独特的地方,下面先来定义一个带Lambda表达式参数的方法:

    接下来调用一下:

    目前我们传的Lambda表达式是已经定义好的函数,接下来我们可以动态的进行Lambda表达式的传递,这里注意了,此时跟Java8的写法就不太一样了,如下:

    这里可以发现,在Kotlin中的Lambda参数不需要写在小括号中,如下:

    另外整个Lambda表达式需要写在大括号中,去掉的话也会报错:

    其实对于这个方法在Kotlin的Lambda写法中还有这么一个规则:“如果一个方法最后一个参数是一个Lambda表达式,那么在调用该方法时传递最后一个参数时Lambda表达式时可以放置在一个方法的执行体中。”,其实这个我们在之前已经使用过了,下面来看一下:

    由于目前test3中有定义默认值我们还木有使用,所以下面使用一下:

    最后咱们一个参数都不传,再看下:

    发现表现上其参数变成了方法的执行体了。。其实这种特性在现代语言如swift中也有类似的支持,这种写法也是在使用Kotlin中用得最多的,反而放在圆括号传参的方式用得不多。

    这里有个注意点了,我们之前对于这个函数:

    它需要满足这个规则:“如果一个默认参数位于其它无默认值的参数前面,那么默认值只能通过在调用函数时使用具名参数【named argument,也就是显示的指定参数名】的方式来使用。”,那貌似这条规则不适应于带有Lambda表达式的test3了,如下:

    所以,这里对带Lambda表达式的方法需要总结一下:“如果函数的最后一个参数是Lambda表达式,而且在调用时是位于圆括号之外,那么就可以不为默认参数传值,换言之,也就是可以不指定Lambda表达式的具名参数名。”

  • 相关阅读:
    TWaver中文社区 » 关于
    RedMon Redirection Port Monitor
    dust good
    HiSpider(Hitask) is a fast and high performance spider with high speed
    42qu.com 找到给你答案的人
    yet another 牛人
    Simple Map Reduce at home
    China (googlegroups) [CPyUG:78205] 基于Python的MapReduce算法的快速构建框架
    retools 0.1 : Python Package Index
    Bloomfilter 的应用场景 黄刚的专栏 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/webor2006/p/11498842.html
Copyright © 2011-2022 走看看