Kotlin - Destructuring Declaration

Destructuring Declarationは、任意のオブジェクトのデータを変数に代入する技術です。

次のコードを見れば理解が早いです。

data class Person(val name: String, val age: Int)

val person = Person("chacha", 10)
val (name, age) = person

personオブジェクトはnameageというデータを持っています。 このデータを nameageという変数の宣言と同時に割り当てています。

鼻間違っこのような文法をサポートしていない場合は、次のように変数の割り当てと 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

参考

codechachaCopyright ©2019 codechacha