在 Kotlin,变量名之前的 Kotlin 星号运算符或传播运算符

我想知道在 Kotlin 变量名前面的星号到底是做什么的。 我在 Spring 启动 Kotlin 示例中看到了这个(*args) :

@SpringBootApplication
open class Application {


@Bean
open fun init(repository: CustomerRepository) = CommandLineRunner {
repository.save(Customer("Jack", "Bauer"))
repository.save(Customer("Chloe", "O'Brian"))
repository.save(Customer("Kim", "Bauer"))
repository.save(Customer("David", "Palmer"))
repository.save(Customer("Michelle", "Dessler"))
}
}


fun main(args: Array<String>) {
SpringApplication.run(Application::class.java, *args)
}
48598 次浏览

在 Kotlin,*运营商被称为 传播接线员

科特林参考文献..。

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

它可以在传递到接受 varargs的函数之前应用到 Array。

比如说..。

如果有一个函数可以接受不同数量的参数..。

fun sumOfNumbers(vararg numbers: Int): Int {
return numbers.sum()
}

使用扩展运算符将数组的元素作为参数传递:

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

备注:

  • *操作符也是 乘法运算符乘法运算符(当然)。
  • 操作符只能在向函数传递参数时使用。操作 无法存储的结果,因为它没有产生值(它是 纯粹的语法糖)。
  • 这个操作符一开始可能会让一些 C/C + + 程序员感到困惑,因为它看起来像是一个被去引用的指针。事实并非如此,Kotlin 拥有美国广播公司(没有指针的概念)。
  • 在调用 vararg 函数时,可以使用操作符 在其他争论之间
  • 操作符类似于各种函数式编程语言中的 apply函数。

文件所述,这是一个扩展运算符:

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

val a = arrayOf(1, 2, 3)
val list = asList(-1, 0, *a, 4)

除了直接回答“这是什么东西! ? !”,您通常会遇到这样的情况,即您有一个 List并希望将其传递给一个期望 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)

然后,为了调用这个方法,我们必须使用扩展运算符,比如:

 sum(*array)

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

* array 等效于 < strong > 1,2,3,4,5

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

Type mismatch.
Required:Int
Found:IntArray

问题是 sum函数接受一个 vararg Int参数(它接受类似于: 1,2,3,4,5这样的值) ,如果我们传递数组,它将作为 IntArray传递。