Kotlin スプレッド オペレーター

David Mbochi Njonge 2023年6月20日
  1. Kotlin プロジェクトを生成する
  2. Kotlin で複数の引数を渡す
  3. Kotlin でスプレッド演算子を使用して複数の引数を渡す
  4. Kotlin でプリミティブ型配列を使用して複数の引数を渡す
  5. まとめ
Kotlin スプレッド オペレーター

拡散演算子 (*) は、Kotlin、TypeScript、JavaScript などのほとんどのプログラミング言語で使用されています。

スプレッド演算子は、複数の引数が必要な場所で複数の引数を渡すために使用されます。 Kotlin では、 vararg キーワードを前に付けた関数パラメーターでスプレッド演算子を使用できます。

vararg キーワードは、関数が可変数の引数を受け入れ、ジェネリック型と非ジェネリック型の両方で使用できることを示します。 このチュートリアルでは、spread operator がどのように機能し、Kotlin で使用されるかについて説明します。

Kotlin プロジェクトを生成する

IntelliJ 開発環境を開き、File > New > Project を選択します。 プロジェクト名をkotlin-spread-operatorと入力し、LanguageセクションでKotlinを選択し、Build systemセクションでIntellijを選択します。

最後に、Create ボタンを押してプロジェクトを生成します。 プロジェクトが開いたら、Main.kt という名前のファイルを src/main/kotlin フォルダーの下に作成し、次のコードをコピーしてファイルに貼り付けます。

class House(
    private val id: Int,
    private val houseType: String,
    private val houseLocation: String){

     companion object{
         fun <T> of(vararg houses: T): List<T>{
             val theHouses = ArrayList<T>();
             for (house in houses) {
                 theHouses.add(house);
             }
             return theHouses;
         }
     }

    fun getId(): Int{
        return this.id;
    }

    override fun toString(): String {
        return "House(id=$id, houseType='$houseType', houseLocation='$houseLocation')"
    }

}

このコードでは、オブジェクトの作成時に指定する必要があるプロパティ idhouseType、および houseLocation を持つ House という名前のクラスを作成しました。

また、of()getId()toString() という名前の 3つのメソッドも定義しました。 of() メソッドはコンパニオン オブジェクト内で定義され、オブジェクトを作成せずに呼び出すことができる静的メソッドであることを示します。

getId() メソッドは現在のオブジェクトの id を返し、toString() メソッドはオブジェクトの文字列表現を取得するのに役立ちます。 次のセクションでこのクラスを使用して、例で使用するインスタンスを作成します。

Kotlin で複数の引数を渡す

House クラス宣言の後に、次のコードをコピーして Main.kt ファイルに貼り付けます。

fun multipleArgumentFunction(){
    val bungalow = House(1,"Bungalow","Seattle");
    val flat = House(2,"Flat","Texas")
    val houses: List<House> = House.of(bungalow, flat);
    houses.forEach(::println);
}

fun main(){
    multipleArgumentFunction();
}

このコードでは、2つの家オブジェクトを作成し、オブジェクトを of() メソッドの引数として渡すことで、これらのオブジェクトのリストを返すメソッドを作成しました。

静的な of() メソッドを定義するときに、1つのパラメーターを提供するのに、なぜ 2つの引数を渡したのか不思議に思うかもしれません。 vararg キーワードがある場合、複数の引数を受け入れることができるメソッドについて言及したことを思い出してください。

静的 of() メソッドには vararg キーワードがあるため、複数の引数を受け入れることができることに注意してください。 このコードを実行して、出力が次のようになっていることを確認します。

House(id=1, houseType='Bungalow', houseLocation='Seattle')
House(id=2, houseType='Flat', houseLocation='Texas')

Kotlin でスプレッド演算子を使用して複数の引数を渡す

複数の引数が必要な場合に複数の引数を渡すためにスプレッド演算子が使用されることを説明しました。スプレッド演算子は通常、データの配列を含むオブジェクトに接頭辞として付けられる * 演算子を使用して示されます。

前のコードにコメントを付け、次のコードをコピーして Main.kt ファイルのコメントの後に貼り付けます。

fun multipleArgumentFunctionWithSpreadOperator(){
    val bungalow = House(1,"Bungalow","Seattle");
    val flat = House(2,"Flat","Texas")

    val apartments: Array<House> = arrayOf(
        House(3,"Apartment","San Francisco"),
        House(4,"Apartment","New York"),
        House(5,"Apartment","Florida")
    );

    val theHouses: List<House> = House.of(bungalow, flat, *apartments);
    theHouses.forEach(::println);
}

fun main(){
    multipleArgumentFunctionWithSpreadOperator();
}

この例は前の例に基づいて構築されており、このコードでは、3つの家オブジェクトを含む Array を追加しています。

of() メソッドを使用すると、可変数の引数を渡すことができます。 この配列をスプレッド演算子を使用してメソッドに渡します。

他の個々のオブジェクトをメソッドに渡すこともできることに注意してください。

構文 *apartments を使用して配列をメソッドに渡し、配列内のすべてのオブジェクトをメソッド内のコードで使用できます。 次のコードを実行し、出力が次のようになっていることを確認します。

House(id=1, houseType='Bungalow', houseLocation='Seattle')
House(id=2, houseType='Flat', houseLocation='Texas')
House(id=3, houseType='Apartment', houseLocation='San Francisco')
House(id=4, houseType='Apartment', houseLocation='New York')
House(id=5, houseType='Apartment', houseLocation='Florida')

Kotlin でプリミティブ型配列を使用して複数の引数を渡す

Kotlin は、IntArrayShortArrayByteArrayLongArray などを含むプリミティブ型の配列を提供します。

アプリケーションでこれらの型を使用している場合、型の不一致エラーが発生する傾向があり、この例はこれを解決する方法を示しています。

前のコードにコメントを付け、次のコードをコピーして Main.kt ファイルのコメントの後に貼り付けます。

fun multipleArgumentFunctionWithTypedArray(){
    val bungalow = House(1,"Bungalow","Seattle");
    val flat = House(2,"Flat","Texas")

    val apartments: Array<House> = arrayOf(
        House(3,"Apartment","San Francisco"),
        House(4,"Apartment","New York"),
        House(5,"Apartment","Florida")
    );

    val apartmentCount: IntArray =
        apartments.map(House::getId).toIntArray();

    val totalHouses: List<Int> =
        House.of(bungalow.getId(),flat.getId(), *apartmentCount.toTypedArray());

    totalHouses.forEach(::println);
}

fun main(){
    multipleArgumentFunctionWithTypedArray();
}

この例の目的は、of() メソッドに渡されたすべての id を整数のコレクション List<Int> として返すことです。

map() メソッドは、家オブジェクトの配列 Array<House> を使用して、toIntArray() メソッドを使用してプリミティブ型配列 IntArray を返します。

オブジェクトのすべての id を返すために、getId() メソッドを使用して個々のオブジェクトの idof() メソッドに渡しました。

スプレッド演算子を使用して、残りのオブジェクト idof() メソッドに渡しました。 ただし、最初にプリミティブ型配列 IntArray を通常の型付き配列 Array<Int> に変換するために toTypedArray() メソッドを使用して Type mismatch エラーを回避しました。

このコードを実行して、出力が次のようになっていることを確認します。

1
2
3
4
5

まとめ

このチュートリアルでは、Kotlin でスプレッド演算子を使用する方法を学びました。カバーしたトピックには、スプレッド演算子を使用して複数の引数を渡す方法と、スプレッド演算子を使用して複数の引数を渡す方法が含まれます。 最後に、プリミティブ型配列を使用して複数の引数を渡す方法について説明しました。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub