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

moj*_*b23 84 syntax kotlin

我想知道在Kotlin中变量名之前asterisk究竟是做什么的.我*argsSpring boot Kotlin上看到了这个():

@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)
}
Run Code Online (Sandbox Code Playgroud)

byx*_*xor 134

*运营商被称为Kotlin 的传播运营商.

来自Kotlin参考 ...

当我们调用vararg函数时,我们可以逐个传递参数,例如asList(1,2,3),或者,如果我们已经有一个数组并且想要将其内容传递给函数,我们使用传播operator(数组前缀为*):

它可以在传递给接受的函数之前应用于Array varargs.

例如...

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

fun sumOfNumbers(vararg numbers: Int): Int {
    return numbers.sum()
}
Run Code Online (Sandbox Code Playgroud)

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

val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'
Run Code Online (Sandbox Code Playgroud)

笔记:

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

  • Spread 运算符是内联数组吗?例如,对于数组 a = [1, 2, 3] funWithVararg(*a) 内联到 funWithVararg(1,2,3) 中?我的意思是在字节码级别。 (2认同)

Jay*_*ard 20

除了直接针对"这是什么东西!?!"的答案之外,你经常会遇到一个List并且想要将它传递给期望a的函数的情况vararg.为此,转换是:

someFunc(x, y, *myList.toTypedArray())
Run Code Online (Sandbox Code Playgroud)

假设该最后一个参数someFuncvararg相同的类型在列表中的元素.


mie*_*sol 10

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

当我们调用vararg函数时,我们可以逐个传递参数,例如asList(1,2,3),或者,如果我们已经有一个数组并且想要将其内容传递给函数,我们使用传播operator(数组前缀为*):

val a = arrayOf(1, 2, 3) 
val list = asList(-1, 0, *a, 4)
Run Code Online (Sandbox Code Playgroud)


Gul*_*hat 7

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


Sur*_*nav 7

如果一个函数接受一个可变参数(可变数量的参数)参数,如:

fun sum(vararg data:Int)
{
   // function body here         
}
Run Code Online (Sandbox Code Playgroud)

现在要调用这个方法,我们可以这样做:

sum(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

但是如果我们在一个数组中有这些值呢,比如:

val array= intArrayOf(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

然后,要调用此方法,我们必须使用扩展运算符,例如:

 sum(*array)
Run Code Online (Sandbox Code Playgroud)

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

*array等价于1,2,3,4,5

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

Type mismatch.
Required:Int
Found:IntArray
Run Code Online (Sandbox Code Playgroud)

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