文章目录

  • 背景
  • 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));}}}
  • Kotlinvararg args: String参数转换成Java的 @NotNull String... args
  • Kotlinspread伸展操作符*args转换成Java(String[])Arrays.copyOf(args, args.length),可见最终还是通过系统拷贝生成了数组。

资料

【1】https://www.kotlincn.net/docs/reference/functions.html

Kotlin 使用vararg可变参数相关推荐

  1. 如何将kotlin数组转为java的可变参数...

    kotlin冷知识:可变参数展开操作符 在数组对象前加*号可以将数组展开,方便传值,比如: var permissions = arrayOf(Manifest.permission.CAMERA, ...

  2. Kotlin传递可变长参数给Java可变参数方法

    定义Java可变参数方法 package com.tcl.john.studymvvm.utils;/*** 调用Java方法的工具类* Created by ZhangJun on 2017/10/ ...

  3. Java vararg(动态参数)的应用

    可变参数在JDK 1.5添加,刚才知道的. 以下来自<Java泛型和集合>一书. 将参数打包成一个数组传入方法中是一件让人讨厌的事,在jdk1.5中加入了一个新的功能称为vararg(动态 ...

  4. C# 中的可变参数方法(VarArgs)

    首先需要明确一点:这里提到的可变参数方法,指的是具有 CallingConventions.VarArgs 调用约定的方法,而不是包含 params 参数的方法.可以通过MethodBase.Call ...

  5. java+list可变参数_Java 可变参数

    众所周知, Java可以通过... 来给一个方法定义一个可变长度的参数. 例如 // 返回可变参数的个数 public void method(int ... i){ System.out.print ...

  6. Python 函数的可变参数(*paramter与**paramter)的使用

    Python 函数的可变参数主要有 *paramter与**paramter 可变参数主要有 *paramter的作用 接受任意多个实际参数并放到一个元组中 def people(*people):f ...

  7. c语言 可变参数的宏,可变参数的宏__ VA_ARGS__的用法

    回顾 在[ANSIC几种特殊的标准定义]中我们讲述了比较常用的几项: __FILE__:正在编译文件的路径及文件名 __LINE__:正在编译文件的行号 __DATE__:编译时刻的日期字符串 如&q ...

  8. java——慎用可变参数列表

    说起可变参数,我们先看下面代码段,对它有个直观的认识,下方的红字明确地解释了可变参数的意思: 1 public class VarargsDemo{ 2 3 static int sum(int... ...

  9. python中lambda 表达式(无参数、一个参数、默认参数、可变参数(*args、**kwargs)、带判断的lambda、列表使用lambda)

    如果⼀个函数有⼀个返回值,并且只有⼀句代码,可以使⽤ lambda简化. lambda语法: lambda 参数列表 : 表达式 注意: lambda表达式的参数可有可⽆,函数的参数在lambda表达 ...

最新文章

  1. 【Python】Autoviz: 一行代码搞定数据集探索并可视化
  2. angular组件--tips提示功能
  3. 特征提取——HOG方向梯直方图
  4. Python开发工程师常见的面试题及答案分享,记得收藏哈!
  5. 表数据库名_关系数据库理论:数据库的六大范式知识笔记
  6. 【BZOJ1406】【codevs2478】密码箱,数论练习
  7. PHP中Foreach在引用时的陷阱
  8. 称重问题 —— 哪个是假币?
  9. Android 基于监听的事件处理机制
  10. vscode :常用快捷操作
  11. Ubuntu常用软件下载
  12. 关于LinkList和LNode*
  13. kubernetes dns详解
  14. 一般描绘性形容词_英语中描绘性形容词是指哪种形容词?
  15. XBOX登录白屏,微软商店无法连接网络
  16. Rsync命令参数以及配置使用
  17. 8.12 纪中集训 Day12
  18. 工业数字化转型中的数据治理
  19. [Jeremy Wu]冒险之路,平凡之路(C++) kkmd66
  20. 【python安装】

热门文章

  1. 联想计算机如何进bois,小编教你联想电脑怎么进入bios
  2. 使用 Drools 规则引擎实现业务逻辑
  3. java计算机毕业设计中小企业人力资源管理系统源码+mysql数据库+系统+部署+lw文档
  4. java读取OPC DA数据---Utgard
  5. 怎么在收藏夹添加多个相同网址?
  6. python编写程序,父类是圆,派生出圆柱体。
  7. WPF使用MEF插件开发打造自己的工具箱
  8. 【飞桨】图神经网络7日打卡营 学习笔记
  9. 园林技术计算机应用技术,自考本科园林:2011年4月02316计算机应用技术历年真题及答案...
  10. git:本地分支与远程分支