Kotlin でのスコープ函数の使用
- Kotlin のスコープ関数
- Kotlin でスコープ関数を使用する
-
Kotlin の
also
スコープ関数を使用する -
Kotlin の
let
スコープ関数を使用する -
Kotlin で
apply
スコープ函数を使用する -
Kotlin で
run
スコープ関数を使用する -
Kotlin の
with
スコープ関数を使用する
この記事では、Kotlin のスコープ函数も
について説明します。Kotlin で利用可能な他のスコープ函数についても説明します。
ただし、最初に、スコープ関数とは何かを理解しましょう。
Kotlin のスコープ関数
Kotlin には、オブジェクトのコンテキストでコードの一部を実行するためだけに作成された多くの関数があります。これらの関数はスコープ関数と呼ばれます。
スコープ関数は、ラムダ式を使用してオブジェクトを呼び出すときに、オブジェクトの一時スコープを作成します。Kotlin には、also
、let
、apply
、run
、および 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)
}
}
出力:
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 の 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 で 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 の 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")
}
}
出力:
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