O *
operador é conhecido como Spread Operator em Kotlin.
Da Referência de Kotlin ...
Quando chamamos uma função vararg, podemos passar os argumentos um por um, por exemplo, asList (1, 2, 3), ou, se já tivermos um array e quisermos passar seu conteúdo para a função, usamos o spread operador (prefixe a matriz com *):
Ele pode ser aplicado a um Array antes de transmiti-lo a uma função que o aceita varargs
.
Por exemplo...
Se você tem uma função que aceita um número variado de argumentos ...
fun sumOfNumbers(vararg numbers: Int): Int {
return numbers.sum()
}
Você pode passar um array para ele assim ...
val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'
Notas:
- O
*
operador também é o operador de multiplicação (é claro).
- O operador só pode ser usado ao passar argumentos para uma função. O resultado da operação não pode ser armazenado, pois não produz nenhum valor (é um açúcar puramente sintático).
- O operador pode confundir alguns programadores C / C ++ no início porque parece que um ponteiro está sendo desreferenciado. Não é; Kotlin não tem noção de ponteiros .
- O operador pode ser usado entre outros argumentos ao chamar uma função vararg. Isso é demonstrado no exemplo aqui .
- O operador é semelhante à
apply
função em várias linguagens de programação funcionais.
Além das respostas diretas para "o que é essa coisa!?!", Você costuma ter o caso em que tem um
List
e deseja passá-lo para uma função que está esperando umvararg
. Para isso, a conversão é:Supondo que o último parâmetro de
someFunc
sejavararg
do mesmo tipo que os elementos da lista.fonte
Conforme descrito na documentação, este é um operador de propagação:
fonte
Se uma função que aceita um parâmetro vararg (número variável de argumentos) como:
Agora, para chamar esse método, podemos fazer:
Mas e se tivermos esses valores em uma matriz, como:
então, para chamar este método, temos que usar o operador spread, como:
Aqui, * (operador de propagação) passará todo o conteúdo desse array.
Mas espere um minuto, e se chamarmos assim:
sum(array)
isso nos dará erro de tempo de compilação de incompatibilidade de tipo:O problema é que a
sum
função aceita umvararg Int
parâmetro (que aceita valores como: 1,2,3,4,5) e se passarmos array, ele será passado comoIntArray
.fonte
Em Java, você pode passar um array como está, mas uma vantagem de desempacotar um array com o operador spread
*
é que o operador spread permite combinar os valores de um array e alguns valores fixos em uma única chamada. Java não suporta isso.fonte
val resultOne = arrayOf(intArrayOne, intArrayTwo)
eval resultTwo = arrayOf(*intArrayOne, *intArrayTwo)
. Os tipos deresultOne
eresultTwo
são respectivamenteArray<Int>
eArray<Array<Int>>
. Eu acredito que esse é um dos motivos