web-dev-qa-db-ja.com

変数名の前のKotlinアスタリスク演算子またはKotlinのスプレッド演算子

Kotlinの変数名の前にアスタリスクが正確に何をするかを知りたい。これを見た (*args)at スプリングブート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)
}
72
mojtab23

*演算子は、Kotlinでは Spread Operator として知られています。

Kotlin Reference ...から.

Vararg-functionを呼び出すとき、引数を1つずつ渡すことができます。 asList(1、2、3)、または既に配列があり、その内容を関数に渡したい場合は、スプレッド演算子を使用します(配列の先頭に*を付けます)。

varargsを受け入れる関数に渡す前に、配列に適用できます。

例えば...

さまざまな数の引数を受け入れる関数がある場合...

fun sumOfNumbers(vararg numbers: Int): Int {
    return numbers.sum()
}

次のように配列を渡すことができます...

val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'

注:

  • *演算子は、乗算演算子(もちろん)です。
  • 演算子は、引数を関数に渡すときにのみ使用できます。操作の結果は、値を生成しないため(/purely構文糖であるため)保存できません
  • オペレーターは、ポインターが逆参照されているように見えるため、最初は一部のC/C++プログラマーを混乱させる可能性があります。そうではありません。 Kotlinには pointer という概念がありません。
  • 演算子は、vararg関数を呼び出すときに、を他の引数の間に使用できます。これは、例 here で示されています。
  • この演算子は、さまざまな関数型プログラミング言語のapply関数に似ています。
120
byxor

「これは何だ!?!」に直接向けられた答えに加えて、Listがあり、vararg。このための変換は次のとおりです。

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

someFuncの最後のパラメーターが、リスト内の要素と同じ型のvarargであると仮定します。

18
Jayson Minard

ドキュメント で説明されているように、これはスプレッド演算子です:

Vararg-functionを呼び出すとき、引数を1つずつ渡すことができます。 asList(1、2、3)、または既に配列があり、その内容を関数に渡したい場合は、スプレッド演算子を使用します(配列の前に*を付けます)。

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

Javaでは配列をそのまま渡すことができますが、スプレッド演算子*を使用して配列をアンパックする利点は、スプレッド演算子で配列の値といくつかの固定値を結合できることです単一の呼び出し。Javaはこれをサポートしません。

2
Gulzar Bhat

Vararg(Variable number of arguments)パラメーターを受け入れる関数が次のような場合:

_fun sum(vararg data:Int)
{
   // function body here         
}
_

このメソッドを呼び出すために、次のことができます。

_sum(1,2,3,4,5)
_

しかし、配列にこれらの値がある場合、次のようになります。

_val array= intArrayOf(1,2,3,4,5)
_

次に、このメソッドを呼び出すには、次のようなスプレッド演算子を使用する必要があります。

_ sum(*array)
_

ここで、*(スプレッド演算子)はその配列のすべてのコンテンツを渡します。

* array1,2,3,4,5と同等です

しかし、ちょっと待ってください。これをsum(array)のように呼び出すと、Type Mismatch compile timeエラーが発生します。

_Type mismatch.
Required:Int
Found:IntArray
_

問題はsum関数が_vararg Int_パラメーター(1,2,3,4,5のような値を受け入れる)を受け入れ、配列を渡す場合、IntArrayとして渡されることです。

1
Suraj Vaishnav