💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ### Kotlin相比于Java | 相比于java | 描述                  | | ------- | ------------------- | | 新增      | 命名参数,提高代码可读写        | | 优化      | 命名参数+默认参数,取代繁琐的重载   | ### [命名参数 ](http://www.kotlincn.net/docs/reference/functions.html#命名参数) 命令参数是指**在方法调用的时候,传入实参的时候,可以按照特定格式传入形参名字**。命名参数又叫具名参数,顾名思义就是指在调用函数时显示指定形参的名称,这样即使形参和实参的顺序不一致也不会有任何影响,因为已经明确指定了每个形参对应的实参,这样有助于提高代码的可读性。具名参数的语法格式如下: ``` 函数名称(形参1=实参1,形参2=实参2,形参3=实参3…) ``` * 形参:全称为“形式参数”,由于它不是实际存在的变量,因此又称虚拟变量,是在定义函数名和函数体时使用的参数,目的是用于接收调用该函数时传入的参数。在调用函数时,实参将赋值给形参。 * 实参:全称为“实际参数”,是在调用时传递给函数的参数。实参可以是常量、变量、表达式、函数等,无论实参是什么类型,在进行函数调用时,实参必须具有确定的值,以便把该值传递给形参,因此可提前用赋值、输入等方法使实参获取确定的值。 #### 一、命令参数的第一个作用就是提高代码的可读性。 命名参数的使用格式如下: ``` methodName(形参名字=实参, 形参名字=实参, 形参名字=实参…) ``` 我们看一段代码,先不用命名参数,代码如下: ~~~ fun main(args: Array<String>) { reformat("aa", true, false, true, 'c')//时间久了,自己也不知道这些参数啥意思了 } //命名参数 fun reformat(str: String, normalizeCase: Boolean, upperCaseFirstLetter: Boolean, divideByCameHumps: Boolean, wordSeparator: Char) { //这里是函数体,自由发挥 } ~~~ 针对以上的reformat方法,这个方法没有去贴方法体,因为不是重点。我们看reformat方法的参数,包含一个Sring类型,三个boolean类型,一个Char类型。所以,第10行,方法调用的时候,就需要进行如下的方式传递: ``` reformat("aa",true,false,true,'c') ``` 但是,**这样长期以往就可能存在一个问题,代码的可读性问题。久而久之,只看方法的调用,就会傻傻分不清楚三个boolean实参具体含义了**。 但是,**如果使用命名参数,代码的可读性就大大提高了**。我们看一下使用命名参数之后的代码,代码如下: ~~~ fun main(args: Array<String>) { //使用命名参数前,时间久了,自己也不知道参数什么意思 reformat("aa", true, false, true, 'c') //使用命名参数,一看就知道参数什么意思 reformat2(str = "aaa", normalizeCase = true, upperCaseFirstLetter = false, divideByCameHumps = true, wordSeparator = 'c') } //使用命名参数前 fun reformat(str: String, normalizeCase: Boolean, upperCaseFirstLetter: Boolean, divideByCameHumps: Boolean, wordSeparator: Char) { //这里是函数体,自由发挥 } //使用命名参数后 fun reformat2(str: String, normalizeCase: Boolean = true, upperCaseFirstLetter: Boolean = true, divideByCameHumps: Boolean = false, wordSeparator: Char = ' ') { //这里是函数体,自由发挥 } ~~~ 如果调用的时候,都这么去写,代码的可读性就大大提高了。所以,**【Kotlin相比于Java,命名参数提高了代码的可读性】**。这就是命令参数的第一个作用。其实这个作用已经不明显,因为高版本的IDEA即使你不写命名参数,IDEA会自动帮我们显示,提高代码的可读性,参考截图: ![](https://box.kancloud.cn/9a56fea28a5c4953c0411339566c7550_679x415.png) #### 二、并且如果我们不需要所有的参数: ``` reformat("aa",normalizeCase=true,false,true,'c') ``` #### 三、当一个函数调用混用位置参数与命名参数时,所有位置参数都要放在第一个命名参数之前。 例如,允许调用`f(1, y = 2)`但不允许`f(x = 1, 2)`。 #### 四、可以通过使用**星号**操作符将[可变数量参数(*vararg*)](http://www.kotlincn.net/docs/reference/functions.html#可变数量的参数varargs)以命名形式传入 ``` fun foo(vararg strings: String) { …… } foo(strings = *arrayOf("a", "b", "c")) ``` #### **五、命名参数的其他作用,需要和默认参数配合起来**。 >[info]【注意】,在调用 Java 函数时不能使用命名参数语法,因为 Java 字节码并不总是保留函数参数的名称。