首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin中入参特性

本专栏的第一篇,分享下Kotlin里输入参数的特性

命名参数

我们先来看一个需求:

把集合里每个元素用分号分隔并打印到括号里,例如(Java,Kotlin,Python,JavaScript,Ruby,Go)

我还想改变输出格式,前缀,分隔符,后缀都有可能发生改变,于是提取出参数,Java实现代码如下:

输出结果:

这是一个完整的编码过程,来了一个需求,通过新增类和方法,在需要的地方,调用实现。需求被解决了,代码默默地在角落发挥着作用。

转眼三个月过去,团队里来了新人,他阅读到testSeparator方法;当读到SeparatorUtils.separator()方法,对于传的四个参数代表什么含义,乍看之下他并不清楚,需要点进去读实现代码或者看注释说明才确切明白。那么还有没有更易于阅读的方式呢?Kotlin的命名参数能做到。

SeparatorUtils.separator方法用Kotlin重写如下:

调用joinToString方法可以这样

上述即是命名参数,在调用处使用,形式为:参数名=参数值;

这样的入参带来了两个便利:

便于阅读,按顺序阅读代码就能知晓方法参数的含义

调用时入参的位置可以任意(调用的入参顺序和定义的入参的顺序允许不一致)

这样看起来真不错的

默认参数

定义函数时,给入参提供默认值,在调用处,如果不传入实参,则该参数使用默认值,可用于方法重载。例如对上述Kotlin代码的joinToString方法改变入参

在Kotlin调用joinToString()支持如下,最后一个我们同时使用了Kotlin的命名参数和默认参数的特性。

上述调用体现了方法重载,默认参数可提供方法重载的效果

上面出现的@JvmOverloads注解是用来做什么的呢?

默认参数特性,使用是有前提的:用Kotlin定义函数,并在Kotlin代码里调用该函数。因此,如果在Java文件里调用Kotlin定义的joinToString方法,默认不支持默认参数特性的,也即方法重载失效。

@JvmOverloads提供了让默认参数特性在Java环境也得到支持。原理是:kotlin代码编译成java代码时,会增加增加下面的方法,这些正是Java方法重载。代码如下:

可变参数

可变参数关键词:vararg(分别取variate和arguments前三个字母)

来看一个Kotlin的Collections类里的一个方法

调用

arrayListOf入参数量可以任意多个

Java实现可变参数,在数据类型后面加三个点:... ,看下Java里的Arrays里的一个方法

展开运算符 *

把数组展开成一个一个元素。展开运算符常与可变运算符联合使用。比如这样:

我得到了一个ArrayList集合,集合里的元素是"a", "b", "c"

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G1HL7700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券