Kotlinでの非構造化宣言

Kotlinでの宣言の破壊

1. 概要

このチュートリアルでは、KotlinでのDestructuring Declarationsの概念を紹介し、その使用方法を見ていきます。

Kotlinについて詳しく知りたい場合は、this articleを確認してください。

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のData Classesの詳細については、thisの記事を確認することを忘れないでください。

2.2. 戻り型

戻り値を操作するときに、構造化宣言も使用できます。

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

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

fun twoValuesReturn(): Pair {
    // ...
    return Pair(1, "success")
}

val (result, status) = twoValuesReturn()

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

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

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

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

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

var map: HashMap = 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の詳細については、間違いなく、Overview of Kotlin Collections APIやすでに説明したData Classes in Kotlinなどの他の記事を確認してください。

そして、いつものように、これらの例の完全な実装は、GitHub projectにあります。