0Pricing
Kotlin Academy · レッスン

applyとwith:設定して返す

applyとwithを使ってオブジェクトを設定し、それぞれの戻り値を理解します。

「applyとwith:設定して返す」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

スコープ関数のまとめ

Kotlin のスコープ関数(apply、also、let、run、with)を使うと、オブジェクトのコンテキストでブロックを実行できます。それぞれ、レシーバー(this と it)と戻り値が異なります。

apply の基本

apply { ... } は、this をレシーバーに束縛してブロックを実行し、レシーバー自体を返します。オブジェクトの設定に最適です。

class Person {
    var name: String = ""
    var age: Int = 0
}
fun main() {
    val p = Person().apply {
        name = "Ada"
        age = 35
    }
    println("${p.name}, ${p.age}")
}

apply が便利な理由

apply を使わない場合、設定用の一時変数を用意してから、その変数を返す必要があります。apply を使えば、これを 1 つの式にまとめられます。

class Config {
    var host: String = ""
    var port: Int = 0
}
fun makeConfig(): Config {
    // Without apply:
    // val c = Config(); c.host = "x"; c.port = 8080; return c
    return Config().apply {
        host = "localhost"
        port = 8080
    }
}
fun main() {
    val c = makeConfig()
    println("${c.host}:${c.port}")
}

チェーン内の apply

apply はレシーバーを返すため、そのまま後続のメソッド呼び出しにつなげられます。

class Builder {
    val parts = mutableListOf<String>()
}
fun main() {
    val result = Builder().apply {
        parts.add("hello")
        parts.add("world")
    }.parts.joinToString(" ")
    println(result) // hello world
}

with の基本

with(receiver) { ... } は、this をレシーバーに設定してブロックを実行し、ラムダの結果を返します(レシーバーは返しません)。レシーバーから派生した値を求める場合に便利です。

class Rect(val w: Int, val h: Int)
fun main() {
    val area = with(Rect(3, 4)) {
        w * h
    }
    println(area) // 12
}

apply と with

apply はレシーバーを返すため、ビルダーに最適です。with はラムダの結果を返すため、レシーバーから値を計算する場合に最適です。

class Box(var width: Int = 0, var height: Int = 0)
fun main() {
    val box = Box().apply { width = 10; height = 20 } // returns Box
    val area = with(box) { width * height }            // returns Int
    println("$box area=$area")
}

List での apply

可変コレクションをインラインで設定します。

fun main() {
    val list = mutableListOf<String>().apply {
        add("a")
        add("b")
        add("c")
    }
    println(list)
}

apply は同じ型を返す

apply の戻り値の型は常にレシーバーの型です。明示的な戻り値を記述する必要はありません。

class Sb {
    private val buf = StringBuilder()
    fun append(s: String): Sb { buf.append(s); return this }
    fun build(): String = buf.toString()
}
fun main() {
    val s = Sb().apply {
        append("Hello, ")
        append("Kotlin!")
    }.build()
    println(s)
}

with で複数のメンバーを再利用

with の内部では、レシーバーのすべてのメンバーがスコープ内に入るため、obj. のプレフィックスは必要ありません。

class Person(val name: String, val age: Int)
fun main() {
    val description = with(Person("Ada", 35)) {
        "Name: $name, Age: $age, AgeNext: ${age + 1}"
    }
    println(description)
}

ネストした apply

階層的な設定を行うために、apply の内部に別の apply をネストできます。ただし、必要最小限にとどめてください。

class Address {
    var city: String = ""
    var zip: String = ""
}
class User {
    var name: String = ""
    var address: Address = Address()
}
fun main() {
    val u = User().apply {
        name = "Ada"
        address.apply {
            city = "Istanbul"
            zip = "34000"
        }
    }
    println("${u.name} in ${u.address.city}")
}

apply を使わない場面

レシーバーを返す必要がない場合は、名前付き引数を使った通常の生成や let/run を優先してください。変化をつけるためだけに apply を使わないでください。

class Config(val host: String, val port: Int)
fun main() {
    // Named arguments often beat builder + apply:
    val cfg = Config(host = "localhost", port = 8080)
    println("${cfg.host}:${cfg.port}")
}

クイックチェック

ブロックの実行後、apply は何を返しますか?

振り返り

applyはレシーバーをthisにしてブロックを実行し、レシーバーを返します。オブジェクトの設定に最適です。withはレシーバーをthisにしてブロックを実行し、ラムダの結果を返します。派生値の計算に最適です。設定が単純な場合は、名前付き引数を使用してください。

よくある質問

「applyとwith:設定して返す」レッスンは無料ですか?

はい。「applyとwith:設定して返す」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「applyとwith:設定して返す」で何を学びますか?

applyとwithを使ってオブジェクトを設定し、それぞれの戻り値を理解します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「applyとwith:設定して返す」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. applyとwith:設定して返す
  2. letとrun:変換とスコープ
  3. also:レシーバーを変更せず副作用を実行する
  4. 適切なスコープ関数の選び方:判断ガイド
← Kotlin Academyに戻る