LoginSignup
0
1

More than 1 year has passed since last update.

【Kotlin基礎】スコープ関数

Posted at

概要

Kotlinを勉強する機会があったのでスコープ関数についてです。

スコープ関数

スコープ関数とは、ラムダ式を受け取る関数です。
受け取ったラムダ式内で、オブジェクトを名前無しで呼び出し可能な一時スコープが生成されます。

thisとit

各スコープ関数では、オブジェクトにアクセスする方法として、ラムダレシーバー 「this」とラムダ引数 「it」 の2つのうちどちらかを使用します。

スコープ関数の種類

Kotlinの標準関数には、 apply、also、let 、 run 、 withの5つのスコープ関数が存在します。

apply

applyは主にプロパティ設定用関数として使えます。
・呼び出し元を「this」で参照(thisは省略可能)
・戻り値は呼び出し元のインスタンス

以下のようなコンストラクタと2つのプロパティを持つクラスの場合

class Book(val name: String){
    var price = 0
    var author: String? = null
}

applyを使用すると以下のようにプロパティを設定できます。

val book = Book("エンジニアの本").apply {
    price = 2000
    author = "エンジニア"
}
println(book.author) //=> エンジニア

また、戻り値が呼び出し元のインスタンスであるため以下の例だとhelloworldは小文字のままです。

val str = "helloworld".apply { toUpperCase() }
println(str) //=> helloworld

also

alsoはapplyと似た使い方をします。
applyと比較すると、ラムダ式の内外でthisの意味が変わらないというメリットがあります。
・呼び出し元を「it」で参照(省略不可)
・戻り値は呼び出し元のインスタンス

val book = Book("エンジニアの本").also {
    it.price = 2000
    it.author = "エンジニア"
}

元のレシーバをitとして参照できますが、以下のようにbookと命名することでコードの可読性向上に繋がります。

val book = Book("エンジニアの本").also { book ->
    book.price = 2000
    book.author = "エンジニア"
}

let

letはレシーバに対してメソッドを実行するといった使い方をします。
・呼び出し元を「it」で参照(省略不可)
・戻り値はラムダの結果(↓の例だとtoUpperCaseされたもの)

val str = "helloworld".let {
    println(it) //=> helloworld
    it.toUpperCase()
}
println(str) //=> HELLOWORLD

主な用途として、以下のようにnullチェックで使用されます。
null許容型のweightプロパティを呼び出し、nullでなければラムダの結果が出力されます。

val person = Person("Alice")
person.weight?.let {
    println("体重: $it")
}

元のレシーバをitとして参照できますが、以下のようにpersonと命名することでコードの可読性向上に繋がります。

val person = Person("Alice")
person.weight?.let { person ->
    println("体重: $person")
}

run

letと出来ることはほぼ同じですが、レシーバを「this」として扱うところが異なります。
・呼び出し元を「this」で参照(thisは省略可能)
・戻り値はラムダの結果

val str = "helloworld".run { toUpperCase() }
println(str) //=> HELLOWORLD

with

withは通常の関数のように呼び出し、2つの引数を取ります。第一引数にレシーバ、第二引数にラムダ式を記述します。
・呼び出し元を「this」で参照(thisは省略可能)
・戻り値はラムダの結果

val str = with("helloworld") { toUpperCase() }
println(str) //=> HELLOWORLD

まとめ

関数 呼び出し元の参照 戻り値
apply this 呼び出し元のインスタンス
also it 呼び出し元のインスタンス
let it ラムダの結果
run this ラムダの結果
with this ラムダの結果

参考資料

Scope functions
Kotlin スコープ関数 用途まとめ
[Kotlin]スコープ関数 apply,also,let,run,withの使い分け

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1