Destructuring Declarationは、任意のオブジェクトのデータを変数に代入する技術です。
次のコードを見れば理解が早いです。
data class Person(val name: String, val age: Int)
val person = Person("chacha", 10)
val (name, age) = person
person
オブジェクトはname
と age
というデータを持っています。
このデータを name
とage
という変数の宣言と同時に割り当てています。
鼻間違っこのような文法をサポートしていない場合は、次のように変数の割り当てと get
メソッドで初期化する必要です。
val name = person.name
val age = person.age
上記の二つのコードを比較すると、 Destructuring Declaration
を使用したコードは、より簡潔で読みやすく良く見えます。
例
Destructuring Declaration
は次のようにfor文にも適用することができます。
val persons = arrayListOf<Person>()
persons.add(Person("chacha", 10))
persons.add(Person("JS", 30))
for ((name, age) in persons) {
println("name: $name, age: $age")
}
もしいくつかの変数を使用しない場合、 _
で省略することができます。未使用の変数を省略すると、必要な変数だけ目に見えるので可読性が良くなることができます。
val (name, _) = person
println("name: $name")
for ((_, age) in persons) {
println("age: $age")
}
次のように map
にも適用することができます。従来は it.name
ようなアプローチが必要ですが、name
で変数を宣言して使用することができます。
persons.map {
println("name: ${it.name}, age: ${it.age}")
}
persons.map { (name, age) ->
println("name: $name, age: $age")
}
原理
Person
クラスはData class
です。データクラスは Destructuring Declaration
サポートのためにいくつかのメソッドを自動的に作成します。
data class Person(val name: String, val age: Int)
次のコードをJavaに変換してみるといくつかのメソッドが作られるのか、どのように動作するか知ることができます。
data class Person(val name: String, val age: Int)
val person = Person("chacha", 10)
val (name, age) = person
次のコードは、上記の鼻間違っコードは、Javaに変換されたコードです。
Person
クラスにcomponent1()
、component2()
と呼ばれるメソッドが生成され、このメソッドを使用して変数を初期化することを知ることができます。
public final class Person {
private final String name;
private final int age;
public Person(@NotNull String name, int age) {
this.name = name;
this.age = age;
}
public final String component1() {
return this.name;
}
public final int component2() {
return this.age;
}
}
Person person = new Person("chacha", 10);
String name = person.component1();
int age = person.component2();
String var4 = "name: " + name + ", age: " + age;
System.out.println(var4);
一般的なクラスにDestructuring Declaration使用する
データクラスではなく、一般的なクラスで Destructuring Declaration
を使用するには、componentN()
メソッドを直接実装します。
componentN()
で N
は1から始まり、変数に代入されている順序です。
重要なのは componentN()
はoperatorメソッドで実装する必要があります。
次の上の Data class
を通常のクラスに変更し、componentN()
メソッドを追加したコードです。
class Person(val name: String, val age: Int) {
operator fun component1() : String = name
operator fun component2() : Int = age
}
val person = Person("chacha", 10)
val (name, age) = person
componentN()
を定義したので、 Destructuring Declaration
を使用することができます。
注意
Destructuring Declaration
を使用するときに注意すべき点は、componentN()
の順に代入になるので、次のように変数の順序を変えても割り当てられている順序が変わらないということです。
val person = Person("chacha", 10)
val (age, name) = person
println("name: $name, age: $age")
// name: 10, age: chacha
参考
Related Posts
- Kotlin - エルビス演算子(Elvis Operation)
- Kotlin - Timer、定期的に関数を実行する
- Kotlinで正規表現を使用する
- Kotlin - 文字列の比較方法(equals、==、compareTo)
- Kotlin - 2つのList一つの併合
- Kotlin - ディレクトリのすべてのファイルのリスト出力
- Kotlin - リストの並べ替え方法(sort、sortBy、sortWith)
- Kotlin - 乱数生成(Random、SecureRandom)
- Kotlin - StringをFloatに変換
- Kotlin - Destructuring Declaration
- Kotlin - objectとclassキーワードの違い
- Kotlin - 現在の日付と時刻を取得する方法