Kotlin でのスコープ函数の使用

Kailash Vaviya 2024年2月15日
  1. Kotlin のスコープ関数
  2. Kotlin でスコープ関数を使用する
  3. Kotlin の also スコープ関数を使用する
  4. Kotlin の let スコープ関数を使用する
  5. Kotlin で apply スコープ函数を使用する
  6. Kotlin で run スコープ関数を使用する
  7. Kotlin の with スコープ関数を使用する
Kotlin でのスコープ函数の使用

この記事では、Kotlin のスコープ函数について説明します。Kotlin で利用可能な他のスコープ函数についても説明します。

ただし、最初に、スコープ関数とは何かを理解しましょう。

Kotlin のスコープ関数

Kotlin には、オブジェクトのコンテキストでコードの一部を実行するためだけに作成された多くの関数があります。これらの関数はスコープ関数と呼ばれます。

スコープ関数は、ラムダ式を使用してオブジェクトを呼び出すときに、オブジェクトの一時スコープを作成します。Kotlin には、alsoletapplyrun、および with の 5つのスコープ関数があります。

Kotlin のすべてのスコープ関数は同じ函数を実行しますが、異なるのは、実行後にそのブロック内のオブジェクトがどのように使用可能になるかです。戻り値とオブジェクト参照に基づいて、5つのスコープ関数の 1つを選択する必要があります。

次の表に、各スコープ関数のオブジェクト参照と戻り値を示します。

スコープ函数 オブジェクトリファレンス 戻り値 拡張函数
also it ラムダバリュー 拡張函数です。
let this ラムダバリュー 拡張函数です。
apply - ラムダバリュー 拡張函数ではありません。
run this ラムダバリュー 拡張函数ではありません。
run this コンテキストオブジェクト 拡張函数です。
with it コンテキストオブジェクト 拡張函数です。

Kotlin でスコープ関数を使用する

以下の例は、Kotlin でのスコープ関数の使用法を示しています。このコードでは、let 関数を使用してオブジェクト Students のスコープを作成します。

data class Student(var firstName: String, var lastName: String, var age: Int, var address: String) {
    fun moving(newAddress: String) { address = newAddress }
    fun ageIncrease() { age++ }
}

fun main() {
    Student("David", "Miller", 24, "New York").let {
        println(it)
        it.moving("Chicago")
        it.ageIncrease()
        println(it)
    }
}

出力:

Kotlin のスコープ函数の使用

scope 関数は、Student オブジェクトを出力で it として参照します。scope 関数を使用しないと、新しい変数を宣言し、それにアクセスするために Student オブジェクトの値で初期化する必要がありました。

Kotlin の also スコープ関数を使用する

上記の表で述べたように、Kotlin の also 関数は、引数(it)としてコンテキストオブジェクトを提供します。コンテキストオブジェクトを任意の関数の引数として取るアクションを実行する必要がある場合は、also を使用できます。

Kotlin で also を使用するもう 1つの優れた方法は、オブジェクトのプロパティや函数ではなく、オブジェクト自体への直接参照が必要な場合です。Kotlin の also 函数を理解するために、以下の例を検討してください。

fun main() {
    val numList = mutableListOf("one", "three", "five")
    numList
        .also { println("Elements in the list before adding a new one: $it") }
        .add("seven")
        println("Elements in the list after adding a new one: " + numList)
}

出力:

Kotlin のスコープ関数も使用します

Kotlin の let スコープ関数を使用する

Kotlin の let スコープ関数は、コンテキストオブジェクトを引数 it として提供します。その戻り値は、ラムダ実行の結果です。

let 関数を使用して複数の関数を呼び出し、コールチェーンの結果を蓄積できます。

fun main() {
    val numList = mutableListOf("one", "three", "five", "seven", "nine")
    val resList = numList.map { it.length }.filter { it > 3 }
    println(resList)
}

出力:

[5,4,5,4]

上記の例で resList を使用する代わりに、let スコープ関数を使用してラムダの結果を出力できます。

fun main() {
    val numList = mutableListOf("one", "three", "five", "seven", "nine")
    numList.map { it.length }.filter { it > 3 }.let{
        println(it)
        //We can add more functions here
    }
}

出力:

[5,4,5,4]

コードに関数が 1つしかない場合は、ラムダ(it)をメソッド参照シンボル(::)に置き換えることができます。

fun main() {
    val numList = mutableListOf("one", "three", "five", "seven", "nine")
    numList.map { it.length }.filter { it > 3 }.let(::println)
}

出力:

[5,4,5,4]

Kotlin で apply スコープ函数を使用する

Kotlin(this)で apply 関数を使用する場合、コンテキストオブジェクトはレシーバーとして使用できます。戻り値を持たないコードのブロックで apply 関数を使用できます。

最も一般的な使用例は、オブジェクトの構成中です。以下の例で、Student オブジェクトを作成し、それを構成するとします。

data class Student(var Name: String, var age: Int = 0, var address: String = "")

fun main() {
    val david = Student("David Miller").apply {
        age = 24
        address = "New York"
    }
    println(david)
}

出力:

Kotlin で applyScopeFunction を使用します

Kotlin で run スコープ関数を使用する

Kotlin で run 関数を使用しているときに、コンテキストオブジェクトをレシーバー(this)として取得します。ラムダ実行結果は、それ自体がこのスコープ関数の戻り値です。

run 関数は、ラムダにオブジェクトの初期化と戻り値の計算の両方がある場合に最も役立ちます。

class port(var url: String, var portNum: Int) {
    fun initialRequest(): String = "Initial default request"
    fun res(request: String): String = "This is the result of query '$request'"
}

fun main() {

    val portService = port("https://example.kotlinlang.org", 80)

    val finalResult = portService.run {
        portNum = 8080
        res(initialRequest() + " to port $portNum")
    }
    // the same code written with let() function:
    val letResult = portService.let {
        it.portNum = 8080
        it.res(it.initialRequest() + " to port ${it.portNum}")
    }
    println(finalResult)
    println(letResult)
}

出力:

Kotlin でスコープ函数の実行を使用する

Kotlin の run を非拡張函数として使用することもできます。これは、式を必要とするステートメントブロックを実行することを意味します。

fun main() {
    val hexNum = run {
        val dig = "0-9"
        val hexDig = "A-Fa-f"
        val indication = "+-"
        Regex("[$indication]?[$dig$hexDig]+")
    }
    for (match in hexNum.findAll("+139 -ABFF 79")) {
        println(match.value)
    }
}

出力:

+139
-ABFF
79

Kotlin の with スコープ関数を使用する

with 関数も run のような非拡張関数です。with 関数の特徴は、引数として渡されますが、レシーバーとして使用できることです。

with は、ラムダの結果を提供したくないコンテキストオブジェクトで関数を呼び出す場合に最適です。

fun main() {
    val num = mutableListOf("one", "three", "five", "seven")
    with(num) {
        println("The function 'with' is called with argument $this")
        println("The function contains $size items")
    }
}

出力:

Kotlin のスコープ函数で使用

著者: Kailash Vaviya
Kailash Vaviya avatar Kailash Vaviya avatar

Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.

LinkedIn

関連記事 - Kotlin Function