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

zfciruhq  于 2023-05-29  发布在  Kotlin
关注(0)|答案(5)|浏览(298)

我想知道在Kotlin中,一个星号在变量名之前到底是做什么的。我在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)
}
nhaq1z21

nhaq1z211#

*运算符在Kotlin中被称为Spread Operator
Kotlin参考:
当调用vararg-函数时,可以单独传递参数,例如asList(1, 2, 3)。如果你已经有了一个数组,并希望将其内容传递给函数,请使用spread运算符(用*作为数组的前缀):
它可以在传递到接受vararg的函数之前应用于Array。

例如...

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

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

ekqde3dh2#

除了那些直接朝着“这是什么东西!?!”,你经常会遇到这样的情况,你有一个List,想把它传递给一个需要vararg的函数。为此,转换为:

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

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

vjrehmav

vjrehmav3#

如文档中所述,这是一个扩展运算符:
当我们调用一个vararg-function时,我们可以一个接一个地传递参数,例如:asList(1,2,3),或者,如果我们已经有一个数组,并希望将其内容传递给函数,我们使用spread运算符(在数组前面加上 *):

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

dm7nw8vv4#

在Java中,你可以按原样传递一个数组,但是使用spread操作符*解包数组的一个优点是spread操作符允许你在一个调用中合并数组中的值和一些固定值。Java不支持这个。

rhfm7lfc

rhfm7lfc5#

如果一个函数接受一个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)

这里,*(spread operator)将传递该数组的所有内容。

*array相当于1,2,3,4,5

但是等一下,如果我们这样称呼它:sum(array)它会给予我们Type Mismatch编译时错误:

Type mismatch.
Required:Int
Found:IntArray

问题是sum函数接受一个vararg Int参数(它接受的值如下:1,2,3,4,5),如果我们传递array,它将被传递为IntArray

相关问题