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... args
Kotlin
的spread
伸展操作符*args
转换成Java
的(String[])Arrays.copyOf(args, args.length)
,可见最终还是通过系统拷贝生成了数组。
资料
【1】https://www.kotlincn.net/docs/reference/functions.html
Kotlin 使用vararg可变参数相关推荐
- 如何将kotlin数组转为java的可变参数...
kotlin冷知识:可变参数展开操作符 在数组对象前加*号可以将数组展开,方便传值,比如: var permissions = arrayOf(Manifest.permission.CAMERA, ...
- Kotlin传递可变长参数给Java可变参数方法
定义Java可变参数方法 package com.tcl.john.studymvvm.utils;/*** 调用Java方法的工具类* Created by ZhangJun on 2017/10/ ...
- Java vararg(动态参数)的应用
可变参数在JDK 1.5添加,刚才知道的. 以下来自<Java泛型和集合>一书. 将参数打包成一个数组传入方法中是一件让人讨厌的事,在jdk1.5中加入了一个新的功能称为vararg(动态 ...
- C# 中的可变参数方法(VarArgs)
首先需要明确一点:这里提到的可变参数方法,指的是具有 CallingConventions.VarArgs 调用约定的方法,而不是包含 params 参数的方法.可以通过MethodBase.Call ...
- java+list可变参数_Java 可变参数
众所周知, Java可以通过... 来给一个方法定义一个可变长度的参数. 例如 // 返回可变参数的个数 public void method(int ... i){ System.out.print ...
- Python 函数的可变参数(*paramter与**paramter)的使用
Python 函数的可变参数主要有 *paramter与**paramter 可变参数主要有 *paramter的作用 接受任意多个实际参数并放到一个元组中 def people(*people):f ...
- c语言 可变参数的宏,可变参数的宏__ VA_ARGS__的用法
回顾 在[ANSIC几种特殊的标准定义]中我们讲述了比较常用的几项: __FILE__:正在编译文件的路径及文件名 __LINE__:正在编译文件的行号 __DATE__:编译时刻的日期字符串 如&q ...
- java——慎用可变参数列表
说起可变参数,我们先看下面代码段,对它有个直观的认识,下方的红字明确地解释了可变参数的意思: 1 public class VarargsDemo{ 2 3 static int sum(int... ...
- python中lambda 表达式(无参数、一个参数、默认参数、可变参数(*args、**kwargs)、带判断的lambda、列表使用lambda)
如果⼀个函数有⼀个返回值,并且只有⼀句代码,可以使⽤ lambda简化. lambda语法: lambda 参数列表 : 表达式 注意: lambda表达式的参数可有可⽆,函数的参数在lambda表达 ...
最新文章
- 【Python】Autoviz: 一行代码搞定数据集探索并可视化
- angular组件--tips提示功能
- 特征提取——HOG方向梯直方图
- Python开发工程师常见的面试题及答案分享,记得收藏哈!
- 表数据库名_关系数据库理论:数据库的六大范式知识笔记
- 【BZOJ1406】【codevs2478】密码箱,数论练习
- PHP中Foreach在引用时的陷阱
- 称重问题 —— 哪个是假币?
- Android 基于监听的事件处理机制
- vscode :常用快捷操作
- Ubuntu常用软件下载
- 关于LinkList和LNode*
- kubernetes dns详解
- 一般描绘性形容词_英语中描绘性形容词是指哪种形容词?
- XBOX登录白屏,微软商店无法连接网络
- Rsync命令参数以及配置使用
- 8.12 纪中集训 Day12
- 工业数字化转型中的数据治理
- [Jeremy Wu]冒险之路,平凡之路(C++) kkmd66
- 【python安装】
热门文章
- 联想计算机如何进bois,小编教你联想电脑怎么进入bios
- 使用 Drools 规则引擎实现业务逻辑
- java计算机毕业设计中小企业人力资源管理系统源码+mysql数据库+系统+部署+lw文档
- java读取OPC DA数据---Utgard
- 怎么在收藏夹添加多个相同网址?
- python编写程序,父类是圆,派生出圆柱体。
- WPF使用MEF插件开发打造自己的工具箱
- 【飞桨】图神经网络7日打卡营 学习笔记
- 园林技术计算机应用技术,自考本科园林:2011年4月02316计算机应用技术历年真题及答案...
- git:本地分支与远程分支