主页 > 创业  > 

Kotlin使用vararg可变参数

Kotlin使用vararg可变参数

文章目录 背景Kotlin中使用可变参数对Kotlin可变参数反编译 资料

背景

一般在项目开发中,我们经常会在关键节点上埋点,而且埋点中会增加一些额外参数,这些参数通常是成对出现且参数个数是不固定的。如下:

//定义事件EVENT_ID const val EVENT_ID = "event_xmkp" //注意:这里传入的是vararg可变参数 fun String.log(vararg args: String) { if (args.size % 2 > 0) { throw RuntimeException("传入的参数必须是偶数") } if (args.isEmpty()) { buryPoint(this) } else { //注意这里:可变参数在作为数组传递时需要使用伸展(spread)操作符(在数组前面加 *) buryPoint(this, *args) } } private fun buryPoint(eventId: String, vararg args: String) { if (args.isNotEmpty()) { Log.e(TAG, "buryPoint: $eventId, args: ${args.toList()}") } else { Log.e(TAG, "buryPoint: $eventId") } }

调用方式如下:

EVENT_ID.log() EVENT_ID.log("name", "小马快跑") EVENT_ID.log("name", "小马快跑", "city", "北京")

示例中可变参数可以是0个、2个、4个,执行结果:

2022-11-22 19:00:54 E/TTT: eventID: event_xmkp 2022-11-22 19:00:54 E/TTT: eventID: event_xmkp, args: [name, 小马快跑] 2022-11-22 19:00:54 E/TTT: eventID: event_xmkp, args: [name, 小马快跑, city, 北京]

可以看到通过定义可变参数,在调用方可以灵活地传入0个或多个参数,下面就分析下Kotlin方法中的可变参数。

注意:可变参数在作为数组传递时需要使用伸展操作符(在数组前面加 *),如果去掉 *号,编译器会报如下错:

Kotlin中使用可变参数

Java中可变参数规则:

使用…表示可变参数可变参数只能在参数列表的最后可变参数在方法体中最终是以数组的形式访问

Kotlin中可变参数规则:

不同于Java,在Kotlin中如果 vararg 可变参数不是列表中的最后一个参数, 可以使用具名参数语法传递其后的参数的值。和Java一样,在函数内,可以以数组的形式使用这个可变参数的形参变量,而如果需要传递可变参数,需要在前面加上伸展(spread)操作符(在数组前面加 *),第一节已给出示例。 对Kotlin可变参数反编译

对上一节中的String.log()代码反编译成Java代码:

//kt代码 fun String.log(vararg args: String) { if (args.size % 2 > 0) { throw RuntimeException("传入的参数必须是偶数") } if (args.isEmpty()) { buryPoint(this) } else { //注意这里:可变参数在作为数组传递时需要使用伸展(spread)操作符(在数组前面加 *) buryPoint(this, *args) } }

转换之后:

// Java代码 public final void log(@NotNull String $this$log, @NotNull String... args) { ... if (args.length % 2 > 0) { throw (Throwable)(new RuntimeException("传入的参数必须是偶数")); } else { if (args.length == 0) { this.buryPoint($this$log); } else { this.buryPoint($this$log, (String[])Arrays.copyOf(args, args.length)); } } } Kotlin的vararg args: String参数转换成Java的 @NotNull String... argsKotlin的spread伸展操作符*args转换成Java的(String[])Arrays.copyOf(args, args.length),可见最终还是通过系统拷贝生成了数组。 资料

【1】 .kotlincn.net/docs/reference/functions.html

标签:

Kotlin使用vararg可变参数由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Kotlin使用vararg可变参数