公開日:2020/01/30更新日:2020/08/03
【Kotlin基礎】スコープ関数letの実装方法と用途を解説

- letの実装方法が知りたい。
- letはどんな時に使うと便利なの?
- let以外のスコープ関数について知りたい。
このような悩みを抱えている方、多いと思います。僕自身、Kotlinを学び始めた頃、「スコープ関数」に初めて出会ったとき、理解するのに苦労したことを覚えております。
本記事では、そんなスコープ関数の中の、letについて詳しく解説しております。
他のスコープ関数につきましては、簡単な解説と、詳細をまとめた記事へのリンクがありますので、そちらをご覧頂けたらと思います。
目次
スコープ関数letの実装方法と用途について
letの基本的な使い方
スコープ関数letは、公式ドキュメントで以下のように定義されております。
- Kotlin
inline fun T.let(block: (T) -> R): R
【公式ドキュメント】 : let – Kotlin Programming Language
もう少しイメージしやすい形にすると、以下のようになります。
- Kotlin
結果 = オブジェクト.let {
// 処理
}
公式ドキュメントの説明文には、「Calls the specified function block with this value as its argument and returns its result.(この値を引数として指定された関数ブロックを呼び出し、結果を返します。)」と記されています。
「この値」とは、上記の”オブジェクト”のことを指しております。
そして、このようにletを呼び出しているオブジェクトのことをレシーバーと呼びます。
「関数ブロック」とは、{ }のことです。
ブロック{ }内では、レシーバーをitで参照することができます。
そして「結果を返します」とあるように、処理の結果を返すことができます。
では、実装例で詳しく見ていきましょう。
- Kotlin
val str = "hello"
val result = str.let {
it.length
}
println(result)
// 5
変数strをレシーバーとし、letの処理が行われております。
ブロック{ }内では、it.lengthという処理が行われておりますね。このitはレシーバーであるstrにあたりますので、it.lengthは”hello”の長さで5となります。
そして、letの処理は結果を返すので、変数resultに5が格納されます。以上がサンプルコードの処理の流れです。
- letは、ブロック{ }内の処理を実行する
- ブロック内の処理を結果として返す
- letを呼び出すオブジェクトをレシーバーと呼ぶ
- ブロック内では、レシーバーをitで呼び出せる
letの具体的な使用用途
続いて、letの具体的な使用用途について解説していきます。
letは、レシーバーのnullチェックで力を発揮します。
例えば、Nullable(nullの可能性があり)な変数Aがあったとしましょう。
この変数Aに対し、何かしらの処理がしたい場合、Javaではif文によるnullチェックを行います。
- Java
if(A != null) {
A.処理
}
これをKotlinでは、letを使用することで以下のように実装することができます。
- Kotlin
A?.let {
it.処理
}
レシーバーAに対し、「?.」というものが付いています。これはセーフコール演算子と呼ばれるもので、変数がnullでなければ変数にアクセスするという役割を持っています。
このセーフコール演算子とletを組み合わせることで、Nullableな変数に対して、安全にアクセスすることができます。
- ?. をセーフコール演算子と呼ぶ
- ?.let { }で、nullでないことを確認し、安全に処理を行うことができる
let以外のスコープ関数について
let以外のスコープ関数について簡単な解説と、詳しい内容をまとめた記事へのリンクを紹介致します。
runについて
runは、公式ドキュメントで以下のように定義されております。
- Kotlin
inline fun run(block: () -> R): R
inline fun T.run(block: T.() -> R): R
【公式ドキュメント】 : run – Kotlin Programming Language
【使用例】
- Kotlin
val number = 10
val result = number.run {
this + 10
}
println(result)
// 20
- ブロック処理内では、レシーバーをthisで参照できる
- ブロック処理の最後の値を返す(レシーバーでなくてもよい)
詳しい解説はこちらをご覧ください。
applyについて
applyは、公式ドキュメントで以下のように定義されております。
- Kotlin
inline fun T.apply(block: T.() -> Unit): T
【公式ドキュメント】 : apply – Kotlin Programming Language
【使用例】
- Kotlin
class User {
var name: String = ""
var age: Int = 0
}
val result = User().apply {
name = "田中"
age = 20
}
println("私の名前は${result.name}です、${result.age}才です。")
// "私の名前は田中です、20才です。
- ブロック処理内では、レシーバーをthisで参照できる
- レシーバー自身を返す
詳しい解説はこちらをご覧ください。
alsoについて
alsoは、公式ドキュメントで以下のように定義されております。
- Kotlin
inline fun T.also(block: (T) -> Unit): T
【公式ドキュメント】 : also – Kotlin Programming Language
【使用例】
- Kotlin
class User {
var name: String = ""
var age: Int = 0
}
val result = User().also {
it.name = "伊藤"
it.age = 30
}
println("私は${result.name}、${result.age}です。)
// "私は伊藤、30才です。
- ブロック処理内では、レシーバーをitで参照できる
- レシーバー自身を返す
詳しい解説はこちらをご覧ください。
まとめ
- letは、ブロック{ }内の処理を実行する
- ブロック内の処理を結果として返す
- letを呼び出すオブジェクトをレシーバーと呼ぶ
- ブロック内では、レシーバーをitで呼び出せる
- ?. をセーフコール演算子と呼ぶ
- ?.let { }で、nullでないことを確認し、安全に処理を行うことができる
関連記事