let (Kotlin)
読み:れっと
外語:let
Kotlinに5種類あるスコープ関数のうちの一つ。
概要
元をitで参照し、戻り値は任意の型を返すことができるスコープ関数である。
Kotlinにおいてitは予約語ではないので任意に変数として用いることが可能であるが、letのスコープ内では元のオブジェクトを暗黙的に一時変数名 it として設定する。
定義
public inline fun <T, R> T.let(f: (T) -> R): R = f(this)
特徴
動作
メソッドの実行をするような場合に使われることが多い。
元のオブジェクトはitで参照できる。itはthisと違って省略することができないが、スコープ内でもthisは変化しないためスコープの内外でthisの意味が変わらないという利点がある。
元のオブジェクトがnullableの場合、obj?.let {} という構文を取ると、objがnullの場合は {} 内は実行されないが、nullではない場合は {} 内が実行される。この時、itにはnon-nullの変数が設定される。
名前を付けられる
何も指定しなければ it になるところ、{} 内の記述をラムダ式として記載すると、それが変数名になる、
つまり obj?.let { hoge -> ...} のように書くことで、it の代わりの変数名を指定することができる(この例の場合はhoge)。
non-nullの場合のみの動作
この動作の特徴を用いると、Javaであれば
if (hoge != null) { ... }
と書かれるところ、次のようにシンプルに書くことができる。
hoge?.let { ... }
hogeがnullであれば、?.呼び出しによりletは実行されず、nullが返される。
hogeがnullでなければ、letが実行され {} 内の結果が返される。この時、スコープ内ではitに元のオブジェクト(この例ではhoge)のnon-nullが設定されるため、?や!!を書く必要がなく、プログラムの記述もシンプルにできる利点がある。
次は、hogeがnullでない場合に、そのtoUpperCase()の結果を返しval upperCaseを定義する例である。
val upperCase: String? = hoge?.let { it.toUpperCase() }
ちなみにこのような単純な処理の場合、letは必ずしも必要なく、次のようにも書ける。
val upperCase: String? = hoge?.toUpperCase()
nullかnon-nullかで切り替える
?.とエルビス演算子を併用する。
hoge?.let {
// non-nullの処理
} ?: run {
// nullの処理
}
letの返却値は {} 内の結果であるため、この結果を用いるような場合には問題が生じる可能性がある。その場合は、同様に元をitで参照しつつ戻り値は呼び出し元のインスタンスになるalsoを使うとよい。
再検索