Kotlin中的变量名称前的Kotlin星号运算符或Kotlin中的Spread运算符

时间:2016-09-08 10:50:22

标签: syntax kotlin

我想知道Kotlin中变量名之前asterisk究竟是做什么的。 我在Spring boot Kotlin example看到了这个(*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)
}

5 个答案:

答案 0 :(得分:108)

*运算符在Kotlin中称为 Spread运算符

来自Kotlin Reference ...

  

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

在将数组传递给接受varargs的函数之前,它可以应用于数组。

例如......

如果你有一个接受不同数量参数的函数......

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

你可以像这样将数组传递给它......

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

备注:

  • *运算符也是乘法运算符(当然)。
  • 只有在将参数传递给函数时才能使用运算符。操作的结果无法存储,因为它不会产生任何值(纯粹语法糖)。
  • 操作员可能首先会混淆一些C / C ++程序员,因为它看起来像是一个指针被取消引用。它不是; Kotlin 没有指针概念
  • 调用vararg函数时,可以在其他参数之间使用运算符。示例here
  • 中对此进行了演示
  • 运算符类似于各种函数式编程语言中的apply函数。

答案 1 :(得分:18)

除了直接针对&#34的答案之外,这是什么东西!?!&#34;,你经常会遇到List并希望将其传递给函数的情况期待vararg。为此,转换为:

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

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

答案 2 :(得分:9)

the documentation所述,这是一个传播运营商:

  

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

如果函数接受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 等效于 1,2,3,4,5

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

Type mismatch.
Required:Int
Found:IntArray

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