カテゴリー
kotlin プログラム言語

kotlin スコープ関数

Kotlinには、スコープ関数と呼ばれる、特定のスコープ内でのみ有効な関数がいくつかあります。主なものには、以下があります。

  1. let: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義します。
  2. also: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義し、オブジェクト自体を返します。
  3. run: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義し、最後に実行された式の結果を返します。
  4. with: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義し、オブジェクト自体を返します。
  5. apply: オブジェクトに対して、特定のスコープ内でのみ有効なローカル変数を定義し、オブジェクト自体を返します。
  6. repeat: 特定のスコープ内で、指定回数繰り返し処理を実行します。

■let関数の使い方

使用方法は次のようになります。

val myString = "Hello, World!"

val result = myString.let { 
    // it は myString を指す
    val newString = it.toUpperCase()
    newString.length
}

println(result)  // 13

上記のコードでは、myStringに対してlet関数を呼び出し、その中で、itというローカル変数を定義し、itにはmyStringが代入されます。 そして、itを大文字に変換し、文字数を取得し、resultに代入しています。 let関数は最後に実行された式の結果を返すので、resultには13が格納されます。

let関数は、nullableな値に対しても使用することができます。その場合、nullableな値がnullでない場合のみ、スコープ内の処理が実行されます。

val myString: String? = "Hello, World!"

val result = myString?.let { 
    // it は myString を指す
    val newString = it.toUpperCase()
    newString.length
}

println(result)  // 13

上記のように、?.演算子を使用し、nullableな値に対してlet関数を呼び出すことができます。 この場合、myStringがnullの場合は、スコープ内の処理は実行されず、resultにはnullが格納されます。

■also関数の使い方

使用方法は次のようになります。

val obj = SomeObject()
val result = obj.also {
    // 処理
}

also 関数は、引数に渡した lambda 式内でオブジェクトに対して処理を行うことができます。その後、処理を行ったオブジェクト自身が返り値となります。

例えば、以下のようにしてオブジェクトのプロパティを更新することができます。

val obj = SomeObject()
val updated = obj.also {
    it.property = "new value"
}

この例では、objproperty プロパティが “new value” に更新され、updated には obj 自身が格納されています。

■run関数の使い方

run 関数は、オブジェクトに対して処理を行い、最後に処理の結果を返す関数です。使い方は、以下のように記述します。

val obj = SomeObject()
val result = obj.run {
    // 処理
    // 結果
}

run 関数は、引数に渡した lambda 式内でオブジェクトに対して処理を行うことができ、最後に処理の結果を返すことができます。

例えば、以下のようにしてオブジェクトのプロパティを取得し、その結果を返すことができます。

val obj = SomeObject()
val propertyValue = obj.run {
    this.property
}

この例では、objproperty プロパティの値が propertyValue に格納されます。

また、run 関数は、オブジェクトに対して複数の処理を行って結果を返す場合に便利です。例えば、以下のようにしてオブジェクトの複数のプロパティを取得し、その結果を返すことができます。

val obj = SomeObject()
val (property1, property2) = obj.run {
    Pair(property1, property2)
}

この例では、objproperty1 プロパティと property2 プロパティの値がそれぞれ property1property2 に格納されます。

also 関数と run 関数は、オブジェクトに対して処理を行うための関数ですが、返り値の違いがあります。

  • also 関数は、処理を行ったオブジェクト自身を返します。
  • run 関数は、処理の結果を返します。

■with関数の使い方

with 関数は、特定のオブジェクトに対して複数の処理を行うための関数です。使い方は、以下のように記述します。

val obj = SomeObject()
with(obj) {
    // 処理1
    // 処理2
    // ...
}

with 関数は、引数に渡したオブジェクトに対して、lambda 式内で複数の処理を行うことができます。 lambda 式内では、そのオブジェクトを this として参照することができます。

例えば、以下のようにして、オブジェクトの複数のプロパティを取得し、それぞれの値を表示することができます。

val obj = SomeObject()
with(obj) {
    println(property1)
    println(property2)
}

また、with 関数は、複数のオブジェクトに対して同じ処理を行う場合にも使用することができます。

val obj1 = SomeObject()
val obj2 = SomeObject()
val obj3 = SomeObject()

with(obj1, obj2, obj3) {
    println(property)
}

このように、with 関数は、複数のオブジェクトに対して同じ処理を行う場合にも使用することができるので、コードを簡潔に書くことができます。

注意点として、with 関数は、処理の結果を返すことはありません。 また、with 関数は、Kotlin1.1以降で利用可能です。

■apply関数の使い方

apply 関数は、オブジェクトに対して複数の処理を行い、そのオブジェクト自身を返すための関数です。使い方は、以下のように記述します。

val obj = SomeObject().apply {
    // 処理1
    // 処理2
    // ...
}

apply 関数は、引数に渡したオブジェクトに対して、lambda 式内で複数の処理を行うことができます。 lambda 式内では、そのオブジェクトを this として参照することができます。

例えば、以下のようにして、オブジェクトの複数のプロパティを設定することができます。

val obj = SomeObject().apply {
    property1 = "value1"
    property2 = "value2"
}

apply 関数は、オブジェクトを返すため、オブジェクトを変更した上で、そのオブジェクトを返す場合に使用することができます。 これにより、以下のような書き方も可能です。

val obj = SomeObject()
val updated = obj.apply {
    property = "new value"
}

また、apply 関数は、also 関数と似ていますが、apply 関数は、オブジェクトを返すのに対して、also 関数は、オブジェクトを返しません。

このように、apply 関数は、オブジェクトを変更した上で、そのオブジェクトを返す場合に使用することができます。

■repeat関数の使い方

repeat 関数は、指定した回数、ブロック内の処理を繰り返し実行するための関数です。使い方は以下のように記述します。

repeat(5) {
    // 処理1
    // 処理2
    // ...
}

この例では、ブロック内の処理を5回繰り返し実行します。

val count = 5
repeat(count) {
    // 処理1
    // 処理2
    // ...
}

繰り返し処理のインデックス値を取得することもできます。

repeat(5) {
    println("Iteration: $it")
}

このように、repeat 関数を使用することで、簡単に指定した回数繰り返し処理を実行することができます。

ちなみにrepeat関数は、高速なforループの代替ですが、高速ではないので、特に処理が重い場合は、forループを使用するほうが良いです。