1.概要

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

Kotlinについてもっと知りたい場合は、リンク:/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の

データクラス

についての詳細は、


this


の記事をチェックすることを忘れないでください。


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()

メソッド(コレクション内の最初の2つの要素を返す)によって返される値が割り当てられます。

ただし、

Map

では、変数はそれぞれ

key



value

になります。

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

map.put(1, person)

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


2.4. Lambdas

のアンダースコアとデストラクタリング

  • 分割宣言で得られたすべての値が必要ない場合は、変数名の代わりにアンダースコアを使用できます。**

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の詳細については、間違いなく


Kotlin Collections APIの概要


や既に言及されている


Kotlin

のデータクラス

などの記事を参照してください。

そして、いつものように、これらの例の完全な実装は私達のhttps://github.com/eugenp/tutorials/tree/master/core-kotlin[GitHubプロジェクト]にあります。