applyとalso
設定と副作用を扱います
「applyとalso」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
オブジェクトの設定
applyとalsoは、ラムダの結果ではなくオブジェクト自体を返すスコープ関数です。そのため、設定やチェーンに適しています。
apply関数
applyは、オブジェクトをthisとするブロックを実行し、オブジェクトを返します。作成後のオブジェクトを初期化するための、典型的なツールです。
fun main() {
val builder = StringBuilder().apply {
append("Hello")
append(", ")
append("World")
}
println(builder.toString())
}applyがオブジェクトを返す理由
applyはレシーバーを返すため、設定済みのオブジェクトをそのまま変数に代入できます。
data class Person(var name: String = "", var age: Int = 0)
fun main() {
val p = Person().apply {
name = "Alice"
age = 30
}
println(p)
}applyはthisを使う
apply内ではオブジェクトがレシーバーになるため、プレフィックスなしでそのプロパティにアクセスできます。
data class Config(var host: String = "", var port: Int = 0)
fun main() {
val config = Config().apply {
host = "localhost"
port = 8080
}
println("${config.host}:${config.port}")
}also関数
alsoは、オブジェクトをitとするブロックを実行し、オブジェクトを返します。オブジェクトを変更しないログ出力や検証などの副作用に使用します。
fun main() {
val numbers = mutableListOf(1, 2, 3)
numbers
.also { println("Before: $it") }
.add(4)
println("After: $numbers")
}alsoはitを使う
alsoはオブジェクトをitとして公開するため、外側のthisを参照したい場合や、参照を明示したい場合に便利です。
fun main() {
val value = 42
.also { println("Logging value: $it") }
println(value)
}applyとalsoの違い
違いはrunとletの関係に似ています。
applyはthisを使い、プロパティの設定に適しています。alsoはitを使い、オブジェクトに対する副作用に適しています。
どちらも元のオブジェクトを返します。
data class Box(var size: Int = 0)
fun main() {
val box = Box()
.apply { size = 5 }
.also { println("Created box with size ${it.size}") }
println(box)
}applyとalsoのチェーン
どちらもオブジェクトを返すため、まず設定を行い、続いて副作用を実行するという流れるようなパイプラインをチェーンで構築できます。
data class Account(var owner: String = "", var balance: Int = 0)
fun main() {
val account = Account()
.apply { owner = "Sam" }
.apply { balance = 100 }
.also { println("New account: $it") }
println(account.balance)
}検証に使うalso
チェーンの途中に流れを途切れさせずチェックを挿入するには、alsoを使います。
fun main() {
val result = listOf(1, 2, 3, 4)
.filter { it % 2 == 0 }
.also { check(it.isNotEmpty()) { "No even numbers" } }
println(result)
}オブジェクトを返すことでパイプラインが可能になる
applyとalsoに共通する特徴は、常に開始時と同じオブジェクトを返すため、チェーンを決して中断しないことです。
fun main() {
val text = StringBuilder()
.apply { append("a") }
.also { it.append("b") }
.apply { append("c") }
println(text)
}applyとalsoの選び方
オブジェクト自身のメンバーを使って初期化または変更する場合は、applyを使います。ログ出力、デバッグ、検証など、オブジェクトを使うものの設定は行わない処理にはalsoを使います。
確認問題
applyとalsoはどの値を返しますか。
復習
オブジェクトを返す2つのスコープ関数について学びました。
applyはthisを使ってオブジェクトを設定します。alsoはitを使ってオブジェクトに副作用を適用します。
どちらもオブジェクトを返すため、すっきりしたチェーンを構築できます。次は、withで操作をまとめます。
よくある質問
「applyとalso」レッスンは無料ですか?
はい。「applyとalso」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「applyとalso」で何を学びますか?
設定と副作用を扱います ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「applyとalso」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。