Syntax Kotlin中变量名前的Kotlin星号运算符或扩展运算符

Syntax Kotlin中变量名前的Kotlin星号运算符或扩展运算符,syntax,kotlin,Syntax,Kotlin,我想知道在Kotlin中,在变量名之前星号到底是做什么的。 我在一本书中看到了这个(*args): @springboot应用程序 公开课申请{ @豆子 打开fun init(存储库:CustomerRepository)=CommandLineRunner{ 保存(客户(“杰克”、“鲍尔”)) 保存(客户(“克洛伊”、“奥布赖恩”)) 保存(客户(“Kim”、“Bauer”)) 保存(客户(“大卫”、“帕尔默”)) 保存(客户(“Michelle”、“Dessler”)) } } 趣味主线(a

我想知道在Kotlin中,在变量名之前星号到底是做什么的。 我在一本书中看到了这个(
*args
):

@springboot应用程序
公开课申请{
@豆子
打开fun init(存储库:CustomerRepository)=CommandLineRunner{
保存(客户(“杰克”、“鲍尔”))
保存(客户(“克洛伊”、“奥布赖恩”))
保存(客户(“Kim”、“Bauer”))
保存(客户(“大卫”、“帕尔默”))
保存(客户(“Michelle”、“Dessler”))
}
}
趣味主线(args:Array){
run(Application::class.java,*args)
}

在Kotlin中,
*
操作符称为扩展操作符

当我们调用vararg函数时,我们可以逐个传递参数,例如asList(1、2、3),或者,如果我们已经有一个数组,并且想要将其内容传递给函数,我们可以使用扩展运算符(在数组前面加*):

在将数组传递到接受
varargs
的函数之前,可以将其应用于数组

例如 如果您有一个接受不同数量参数的函数

fun sumOfNumbers(vararg numbers: Int): Int {
    return numbers.sum()
}
使用spread运算符传递数组的元素作为参数:

val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'

注意事项:

  • *
    运算符也是乘法运算符(当然)
  • 运算符只能在向函数传递参数时使用。操作的结果无法存储,因为它不产生任何值(纯粹是语法糖)
  • 这个操作符一开始可能会让一些C/C++程序员感到困惑,因为它看起来像是一个指针正在被取消引用。事实并非如此;Kotlin没有指针的概念
  • 调用vararg函数时,该运算符可在其他参数之间使用。这在示例中得到了演示
  • 该运算符类似于各种函数式编程语言中的
    apply
    函数
如中所述,这是一个扩展运算符:

当我们调用vararg函数时,我们可以逐个传递参数,例如。 asList(1,2,3),或者,如果我们已经有了一个数组并且想要传递它的 对于函数的内容,我们使用扩展运算符(数组前缀 连同*):


除了直接针对“what is this!?!”的答案外,您经常会遇到这样的情况:您有一个
列表
,并希望将其传递给一个需要
vararg的函数。为此,转换为:

someFunc(x, y, *myList.toTypedArray())

假设
someFunc
的最后一个参数是与列表中的元素类型相同的
vararg

在Java中,可以按原样传递数组,但使用扩展运算符
*
解包数组的一个优点是,扩展运算符允许您在单个调用中组合数组中的值和一些固定值。Java不支持此功能。

如果函数接受vararg(变量数量参数)参数,如:

fun sum(vararg data:Int)
{
   // function body here         
}
现在要调用此方法,我们可以执行以下操作:

sum(1,2,3,4,5)
但是如果我们在数组中有这些值,比如:

val array= intArrayOf(1,2,3,4,5)
然后,要调用此方法,我们必须使用spread运算符,如:

 sum(*array)
这里,*(扩展运算符)将传递该数组的所有内容

*数组相当于1,2,3,4,5

但是等一下,如果我们这样称呼它:
sum(array)
它将给我们提供类型不匹配的编译时错误:


问题是
sum
函数接受
vararg Int
参数(它接受像:1,2,3,4,5这样的值),如果我们传递数组,它将作为
IntArray
传递,非常感谢!这应该在官方文档中的spread operator部分中,作为spread operator不工作时需要注意的事项。谢谢!真的很有帮助。想知道幕后的“传播运营商”是什么?这仅仅是一种获得varargs值的方法吗?投票结果是向上的,因为我问自己为什么他们要这样实现它。我还不是100%确定。我的意思是,他们不能在大多数情况下推断出这一点吗?@ Timb u,在某些情况下,它是不可能推断的,请考虑下列情况:代码> Val.ReultOnt= AlrayOf(InTayRayOne,InTayRay2)< /C>和 Val.Reult2 = Rayayof(*InTayRayOne,*InTayRay2)< /C>。
resulttone
resultTwo
的类型分别是
Array
Array
。我相信这就是扩展运算符内联数组的原因之一?例如,对于数组a=[1,2,3]funWithVararg(*a)将内联线插入到funWithVararg(1,2,3)中?我是说字节码级别。
val array= intArrayOf(1,2,3,4,5)
 sum(*array)
Type mismatch.
Required:Int
Found:IntArray