Kotlinでの非構造化宣言
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プロジェクト]にあります。