also:レシーバーを変更せず副作用を実行する
ログ出力、デバッグ、副作用だけを目的とする処理にalsoを使用します。
「also:レシーバーを変更せず副作用を実行する」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
alsoの概要
alsoはレシーバーをitとしてブロックを実行し、レシーバーを変更せずに返します。チェーンを中断せずに、ログ出力、デバッグ、検証などの副作用を実行するのに最適です。
alsoの基本
also { ... }は副作用を実行し、同じ値を返すため、呼び出しを自然につなげられます。
fun main() {
val nums = listOf(1, 2, 3, 4)
.also { println("input: $it") }
.filter { it % 2 == 0 }
.also { println("filtered: $it") }
println(nums)
}ログ出力にalsoを使う
パイプラインの途中にログ出力を追加しても、処理の流れを壊しません。
fun main() {
val processed = " Hello, Kotlin! "
.also { println("raw: '$it'") }
.trim()
.also { println("trimmed: '$it'") }
.uppercase()
println(processed)
}デバッグにalsoを使う
リファクタリング中に中間状態を確認するにはalsoを使用します。後から削除してもチェーンを変更せずに済みます。
fun main() {
val sum = (1..5).toList()
.also { println("list: $it") }
.sum()
.also { println("sum: $it") }
println("final: $sum")
}alsoとapplyの違い
applyはthisを使用します(代入に適しています)。alsoはitを使用します(明示的な参照や副作用に適しています)。
class Counter {
var value: Int = 0
}
fun main() {
val c = Counter().apply { value = 10 } // uses this implicitly
val d = Counter().also { it.value = 10 } // uses it explicitly
println("${c.value} / ${d.value}")
}初期化時の副作用にalsoを使う
オブジェクトの作成中に、プロパティの設定以外の処理を実行したい場合に便利です。
class Repository {
val cache = mutableMapOf<String, String>()
fun init() = println("Repository initialized")
}
fun main() {
val r = Repository().also { it.init() }
r.cache["key"] = "value"
println(r.cache)
}alsoは元の値を返す
レシーバーは変更されずにそのまま渡されるため、簡単にチェーンをつなげられます。
fun main() {
val len = "Hello".also { println("got: $it") }.length
println(len) // 5
}検証にalsoを使う
チェーンの途中でアサーションを実行できます。
fun main() {
val n = listOf(1, 2, 3, 4)
.filter { it > 0 }
.also { require(it.isNotEmpty()) { "must have positives" } }
.sum()
println(n)
}alsoとletの組み合わせ
同じパイプライン内で、副作用にはalsoを、変換にはletを使用します。
fun main() {
val raw: String? = " 42 "
val n = raw
?.also { println("raw: '$it'") }
?.let { it.trim().toIntOrNull() }
?.also { println("parsed: $it") }
println(n)
}コレクションへの追加にalsoを使う
生成したオブジェクトをリストにインラインで追加できます。
class User(val name: String)
fun main() {
val users = mutableListOf<User>()
val ada = User("Ada").also { users.add(it) }
val ben = User("Ben").also { users.add(it) }
println(users.map { it.name })
}alsoを使う場面
ログ出力、検証、登録などの副作用が必要で、元の値をそのまま次へ渡したい場合は、alsoを使用します。
fun main() {
val total = listOf(10, 20, 30, 40, 50)
.also { println("count: ${it.size}") }
.filter { it >= 30 }
.also { println("kept: $it") }
.sum()
println("total: $total")
}アンチパターン:再代入にalsoを使う
実際には変換が必要な場合にalsoを使わないでください。その場合はletまたはrunを使用します。
fun main() {
val name = "ada"
// BAD: also returns receiver, so upper is wrong
// val upper = name.also { it.uppercase() } // upper == "ada"
val upper = name.let { it.uppercase() }
println(upper) // ADA
}クイックチェック
ブロックの実行後、alsoはどの値を返しますか?
振り返り
alsoはitを使って副作用のブロックを実行し、レシーバーを返します。値を変更せずに確認したい場合のログ出力、デバッグ、検証、登録などに使用します。変換には、代わりにletまたはrunを使用してください。
よくある質問
「also:レシーバーを変更せず副作用を実行する」レッスンは無料ですか?
はい。「also:レシーバーを変更せず副作用を実行する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「also:レシーバーを変更せず副作用を実行する」で何を学びますか?
ログ出力、デバッグ、副作用だけを目的とする処理にalsoを使用します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「also:レシーバーを変更せず副作用を実行する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- applyとwith:設定して返す
- letとrun:変換とスコープ
- also:レシーバーを変更せず副作用を実行する
- 適切なスコープ関数の選び方:判断ガイド