はじめに
Kotlinの標準ライブラリにはスコープ関数という関数が存在します。
自分自身、JavaからKotlinに入ったのでそれなりの文法などはすんなりと理解できたのですが、スコープ関数についてはJavaには無いので理解が薄いままなんとなくで使用していました。
今回理解を深めるために少し調べてみたので備忘録を含めまとめたいと思います。
5つのスコープ関数
Kotlinには5つのスコープ関数が用意されています。
- let
- apply
- run
- also
- with
これらの関数は、基本的に全て同じことを行いますが、それぞれ特徴がありますのでまとめます。
(with
に関してはほとんど使用機会がありません(自分は)ので今回は割愛させていただきます。)
let
まずは使用頻度の高いlet
スコープ関数名 | 対象オブジェクト | 戻り値 |
---|---|---|
let | it | 最後の実行コード |
val foo: Int? = 3
val hoge = foo?.let { it * 2 } ?: 0
println("hoge : $hoge")
let
は主にnullableな変数に対して使用する事が多く、nullチェックをスマートに記述することができます。
hoge : 6
fooがnullではない場合let
スコープ内の処理が行われます( it * 2 )
fooがnullの場合エルビス演算子に処理が移り0が返ります。
val foo: Int? = 3
val hoge =
if (foo != null) {
foo * 2
} else {
0
}
よくあるnullをif文でチェックして処理を分岐する簡単なコード。
val foo: Int? = 3
val hoge = foo?.let { foo ->
foo * 2
} ?: 0
スコープ関数を用いて記述するとこのようにスッキリ書けます。
val foo: Int? = 3
val hoge = foo?.let { foo ->
foo * 10000
foo * 20000
foo * 0 // ←これが戻り値
}
print("hoge : $hoge")
冒頭でも説明したようにlet
ではlet
スコープ内で最後に評価した値が戻り値として返ります。
hoge : 0
let
スコープ内でfoo
の値をどんだけ書き換えても最後の行の値が返されているのがわかります。
run
runはletと似ています.
スコープ関数名 | 対象オブジェクト | 戻り値 |
---|---|---|
run | this | 最後の実行コード |
run
とlet
の違いは対象オブジェクトをthis
で参照できる点です。また、Kotlinではthis
は省略可能ですのでより簡潔に記述することが可能です。
val hoge = foo?.run {
toString() // this.toString()
}
also
スコープ関数名 | 対象オブジェクト | 戻り値 |
---|---|---|
also | it | 対象オブジェクト |
also
はlet
やrun
と違い戻り値が対象オブジェクト自身です。
一つのオブジェクトに対してまとめて処理を実行した場合などに便利です。(AndroidだとViewの初期化処理等)
// ↓これが戻り値
val testText = binding.testText
testText.text = data.peekContent()
testText.setOnClickListener{ } // クリック処理
// ↓これが戻り値
val testText = binding.testText.also {
it.text = data.peekContent()
it.setOnClickListener { } // クリック処理
}
apply
スコープ関数名 | 対象オブジェクト | 戻り値 |
---|---|---|
apply | this | 対象オブジェクト |
apply
はalso
の対象オブジェクトがthis
バージョンといった感じです。
val intent = Intent(this, SubActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY )
intent.addCategory("test")
startActivity(intent)
同じ記述(intent)が続くので無駄感がある。
Intent(this, SubActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY )
addCategory("test")
startActivity(this)
}
スコープ関数を使用することでスッキリ書くことができます。
apply
は対象のオブジェクト自身が戻り値になるので、 startActivity(this
) と記述します。
さいごに
Kotlinのスコープ関数についてまとめてみました。
実務ではまだ上手く使用できていませんが、便利に活用できたらなと思います。
また、スコープ関数の便利な使い方などあればコメント頂けると幸いです!!
ではまたっ!!