变量名称前的Kotlin星号运算符或Kotlin中的Spread运算符
我想知道在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) }
*
运算符在Kotlin中称为Spread运算符 。
从Kotlin参考 …
当我们调用可变参数函数的时候,我们可以逐个传递参数,比如asList(1,2,3),或者如果我们已经有一个数组并且想把它的内容传给函数,我们使用spread操作符(以*为前缀):
在将数组传递给接受varargs
的函数之前,它可以应用于数组。
例如…
如果你有一个接受不同数量参数的函数
fun sumNumbers(vararg numbers: Int): Int { return numbers.sum() }
你可以像这样传递数组
val numbers = intArrayOf(2, 3, 4) val sum = sumNumbers(*numbers) println(sum) // Prints '9'
笔记:
-
*
运算符也是乘法运算符 (当然)。 - Spread运算符只能在将参数传递给函数时应用。 操作的结果不能被存储,因为它是纯粹的语法糖。
- 一开始,操作员可能会混淆一些C / C ++程序员,因为它看起来像一个指针正在被取消引用。 不是; 科特林没有指针的概念 。
- 调用可变参数函数时,可以在其他参数之间使用扩展运算符。 这个例子在这里演示。
- 在各种函数式编程语言中,运算符与
apply
函数非常相似。
除了直接针对“这是什么东西!?!”的答案之外,你经常会遇到这样的情况:你有一个List
并且想把它传递给一个期待vararg
的函数。 为此,转换是:
someFunc(x, y, *myList.toTypedArray())
假设someFunc
最后一个参数是与列表中的元素相同类型的vararg
参数。
如文件中所述,这是一个扩展运算符:
当我们调用可变参数函数的时候,我们可以逐个传递参数,比如asList(1,2,3),或者如果我们已经有一个数组并且想把它的内容传给函数,我们使用spread操作符(以*为前缀):
val a = arrayOf(1, 2, 3) val list = asList(-1, 0, *a, 4)