Der *
Operator ist in Kotlin als Spread Operator bekannt .
Aus der Kotlin-Referenz ...
Wenn wir eine vararg-Funktion aufrufen, können wir Argumente einzeln übergeben, z. B. asList (1, 2, 3), oder wenn wir bereits ein Array haben und dessen Inhalt an die Funktion übergeben möchten, verwenden wir den Spread Operator (stellen Sie dem Array * voran):
Es kann auf ein Array angewendet werden, bevor es an eine akzeptierende Funktion übergeben wird varargs
.
Beispielsweise...
Wenn Sie eine Funktion haben, die eine unterschiedliche Anzahl von Argumenten akzeptiert ...
fun sumOfNumbers(vararg numbers: Int): Int {
return numbers.sum()
}
Sie können ein Array wie folgt übergeben ...
val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'
Anmerkungen:
- Der
*
Operator ist (natürlich) auch der Multiplikationsoperator .
- Der Operator kann nur verwendet werden, wenn Argumente an eine Funktion übergeben werden. Das Ergebnis der Operation kann nicht gespeichert werden, da es keinen Wert ergibt (es ist rein syntaktischer Zucker).
- Der Operator kann einige C / C ++ - Programmierer zunächst verwirren, da es so aussieht, als würde ein Zeiger de-referenziert. Es ist nicht; Kotlin hat keine Ahnung von Zeigern .
- Der Operator kann beim Aufrufen einer vararg-Funktion zwischen anderen Argumenten verwendet werden. Dies wird im Beispiel hier gezeigt .
- Der Operator ähnelt der
apply
Funktion in verschiedenen funktionalen Programmiersprachen.
Zusätzlich zu den Antworten, die direkt auf "Was ist das für ein Ding!?!" Waren, haben Sie häufig den Fall, dass Sie eine haben
List
und diese an eine Funktion übergeben möchten, die eine erwartetvararg
. Dafür lautet die Konvertierung:Angenommen, der letzte Parameter von
someFunc
istvararg
vom gleichen Typ wie die Elemente in der Liste.quelle
Wie in der Dokumentation beschrieben, handelt es sich um einen Spread-Operator:
quelle
Wenn eine Funktion, die einen vararg-Parameter (Variable Anzahl der Argumente) akzeptiert, wie folgt lautet:
Um diese Methode aufzurufen, können wir Folgendes tun:
Aber was ist, wenn wir diesen Wert in einem Array haben, wie:
Um diese Methode aufzurufen, müssen wir den Spread-Operator verwenden, wie:
Hier übergibt * (Spread-Operator) den gesamten Inhalt dieses Arrays.
Aber warte eine Minute, was ist, wenn wir es so nennen:
sum(array)
Es gibt uns einen Fehler bei der Kompilierungszeit von Type Mismatch:Das Problem ist, dass die
sum
Funktion einenvararg Int
Parameter akzeptiert (der einen Wert wie: 1,2,3,4,5 akzeptiert). Wenn wir ein Array übergeben, wird es als übergebenIntArray
.quelle
In Java können
*
Sie ein Array unverändert übergeben. Ein Vorteil beim Entpacken eines Arrays mit dem Spread-Operator besteht jedoch darin, dass Sie mit dem Spread-Operator die Werte eines Arrays und einige feste Werte in einem einzigen Aufruf kombinieren können. Java unterstützt dies nicht.quelle
val resultOne = arrayOf(intArrayOne, intArrayTwo)
undval resultTwo = arrayOf(*intArrayOne, *intArrayTwo)
. Art vonresultOne
undresultTwo
sind jeweilsArray<Int>
undArray<Array<Int>>
. Ich glaube, das ist einer der Gründe