1. 概要

このチュートリアルでは、KotlinでのDestructuring Declarationsの概念を紹介し、それをどのように使用できるかを見ていきます。

Kotlinについて詳しく知りたい場合は、この記事をご覧ください。

2. 破壊宣言

この概念は、オブジェクトを個別の変数のセットとして扱うことで構成されています。

2.1. オブジェクト

オブジェクトを複数の変数に分解すると便利な場合があります。

val person = Person(1, "Jon Snow", 20)
val(id, name, age) = person

これにより、3つの新しい変数を作成しました。

println(id)     //1
println(name)   //Jon Snow
println(age)    //20

破壊宣言は、次のコードとしてコンパイルされます。

val id = person.component1();
val name = person.component2();
val age = person.component3();

破壊宣言を使用するには、コンポーネントが operator でマークされているか、クラスがdataキーワードでマークされていることを確認する必要があります。

Kotlinのデータクラスの詳細については、このの記事を確認することを忘れないでください。

2.2. 返品タイプ

破壊宣言は、戻り値を操作するときにも使用できます。

fun getPersonInfo() = Person(2, "Ned Stark", 45)
val(id, name, age) = getPersonInfo()

または、関数から2つの値を返す必要があるとします。

fun twoValuesReturn(): Pair<Int, String> {
    // ...
    return Pair(1, "success")
}

val (result, status) = twoValuesReturn()

2.3. コレクションとForループ

forループを使用してコレクションを反復処理するには、次のように非構造化宣言を使用します。

for ((a, b) in collection) { ... }

変数aおよびbには、 component1()および component2()メソッドによって返される値が割り当てられます。コレクション。

ただし、 Map では、変数はそれぞれ keyvalue、になります。

var map: HashMap<Int, Person> = HashMap()

map.put(1, person)

for((key, value) in map){
    println("Key: $key, Value: $value")
}

2.4. ラムダスでのアンダースコアとデストラクチャリング

破壊宣言で取得したすべての値が必要ない場合は、変数名の代わりにアンダースコアを使用できます。

val (_, name, age) = person

または、不要なフィールドが最後にある場合は、それらを完全に省略できます。

val (id, name) = person

適切なcomponentN関数を持つ型である限り、ラムダパラメーターの非構造化宣言構文を使用することもできます。

map.mapValues { entry -> "${entry.value}!" }
map.mapValues { (key, value) -> "$value!" }

2つのパラメーターを宣言することと、破壊ペアを宣言することの違いに注意してください。

{ a -> ... } // one parameter
{ a, b -> ... } // two parameters
{ (a, b) -> ... } // a destructured pair
{ (a, b), c -> ... } // a destructured pair and another parameter

3. 結論

この簡単な記事では、KotlinのDestructuring Declarationsに、その多くの使用法と特殊性について説明しました。

Kotlinの詳細については、 KotlinCollectionsAPIの概要やすでに説明したKotlinのデータクラスなどの他の記事をご覧ください。

そして、いつものように、これらの例の完全な実装は、GitHubプロジェクトにあります。