Genta Hirauchi

公開日:2020/01/30
更新日:2020/03/22

【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が格納されます。以上がサンプルコードの処理の流れです。

Point
  • 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な変数に対して、安全にアクセスすることができます。

Point
  • ?. をセーフコール演算子と呼ぶ
  • ?.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
Point
  • ブロック処理内では、レシーバーをthisで参照できる
  • ブロック処理の最後の値を返す(レシーバーでなくてもよい)

詳しい解説はこちらをご覧ください。

【Kotlin基礎】スコープ関数runの実装方法と用途を解説

Kotlinには、スコープ関数という、シンプルですが、覚えておくと便利な関数があります。スコープ関数にはいくつか種類があるのですが、本記事では、runというスコープ関数について解説致します。

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才です。
Point
  • ブロック処理内では、レシーバーをthisで参照できる
  • レシーバー自身を返す

詳しい解説はこちらをご覧ください。

【Kotlin基礎】スコープ関数applyの実装方法と用途を解説

スコープ関数は、初めはなかなか理解しづらいかもしれませんが、覚えておくととても便利です。本記事では、スコープ関数applyについて解説致します。他のスコープ関数(let, run, also等)につきましては、簡単な解説と、詳細をまとめた記事へのリンクがありますので、そちらをご覧頂けたらと思います。

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才です。
Point
  • ブロック処理内では、レシーバーをitで参照できる
  • レシーバー自身を返す

詳しい解説はこちらをご覧ください。

【Kotlin基礎】スコープ関数alsoの実装方法と用途を解説

Kotlinにはスコープ関数という覚えておくと便利な関数があります。スコープ関数にはいくつか種類があるのですが、本記事では、スコープ関数alsoに焦点を当て解説致します。他のスコープ関数(let, run, apply等)につきましては、簡単な解説と、各記事へのリンクがありますので、そちらをご覧頂けたらと思います。

まとめ

  • letは、ブロック{ }内の処理を実行する
  • ブロック内の処理を結果として返す
  • letを呼び出すオブジェクトをレシーバーと呼ぶ
  • ブロック内では、レシーバーをitで呼び出せる
  • ?. をセーフコール演算子と呼ぶ
  • ?.let { }で、nullでないことを確認し、安全に処理を行うことができる