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

问题描述 投票:0回答:5

我想知道 Kotlin 中变量名之前的星号到底做什么。 我在

Spring boot 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)
}
syntax kotlin
5个回答
290
投票

*
运算符在 Kotlin 中称为 Spread Operator

来自 Kotlin 参考

当您调用

vararg
函数时,您可以单独传递参数,例如
asList(1, 2, 3)
。如果您已经有一个数组并希望将其内容传递给函数,请使用展开运算符(在数组前面加上
*
前缀):

它可以应用于数组,然后将其传递给接受

vararg
的函数。

例如...

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

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
    函数。

35
投票
除了直接回答“这是什么东西!?!”的答案之外,您还经常遇到这样的情况:您有一个

List

 并希望将其传递给需要 
vararg
 的函数。  为此,转换为:

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

假设

someFunc

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


13
投票

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

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

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

    

8
投票
考虑一个接受 vararg(

Variable number of arguments)参数的函数,如下所示:

fun sum (vararg data: Int) { // function body here }
我们可以用

调用这个方法

sum(1,2,3,4,5)
但是如果我们在数组中有相同的值,例如:

val array = intArrayOf(1,2,3,4,5)
然后,我们可以使用扩展运算符来调用此方法,例如:

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

*

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

但是像这样的电话:

sum(array)
会给我们类型不匹配编译时错误:

Type mismatch. Required:Int Found:IntArray

这是因为数组

sum(array)

 将作为 
IntArray
 传递,但此调用 
sum(*array)
 会将数组的内容传递给函数。


7
投票
在 Java 中,您可以按原样传递数组,但使用扩展运算符

*

 解包数组的一个优点是扩展运算符允许您在一次调用中组合数组中的值和一些固定值。 Java 不支持这个。

© www.soinside.com 2019 - 2024. All rights reserved.