遅延操作
中間リストを避けます
「遅延操作」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
遅延操作
シーケンスの力は、遅延操作にあります。中間操作は実行せずにパイプラインを構築し、終端操作が要素を取り出したときに初めて処理が進みます。これにより、中間リストを作成せずに済みます。
中間リストを作成しない
コレクションでは、mapやfilterを実行するたびに新しいリストが割り当てられます。シーケンスでは、一時的なリストを作成せずに要素がすべての処理を順に流れます。
fun main() {
val result = (1..6).asSequence()
.map { it * it }
.filter { it % 2 == 0 }
.toList()
println(result)
}遅延性を観察する
終端操作がなければ、ラムダ式は1つも実行されません。パイプラインは、消費されるまで単なる処理手順にすぎません。
fun main() {
val pipeline = (1..3).asSequence()
.map { println("map $it"); it }
println("Built pipeline, nothing ran")
pipeline.toList()
}take による処理の制限
take(n)は遅延中間操作です。無限ジェネレーターと組み合わせると、n個の要素を生成した時点で停止します。
fun main() {
val firstThree = generateSequence(1) { it + 1 }
.map { it * 10 }
.take(3)
.toList()
println(firstThree)
}first による短絡評価
firstのような終端操作は、必要な結果を得るとすぐに停止し、残りの要素を完全にスキップします。
fun main() {
val result = (1..1000).asSequence()
.map { println("processing $it"); it }
.first { it > 3 }
println("Found $result")
}要素単位のストリーミング
シーケンスでは、まず要素1がmap、続いてfilterを通過し、その後に要素2が同じ処理を通過します。この順序により、短絡評価が可能になり、すべての結果をバッファーに保持せずに済みます。
fun main() {
listOf(1, 2, 3, 4).asSequence()
.filter { println("filter $it"); it % 2 == 0 }
.map { println("map $it"); it * 10 }
.toList()
}takeWhile と dropWhile
takeWhileは述語が失敗するまで要素を返し、dropWhileは述語が成立している間、先頭の要素をスキップします。どちらも遅延操作です。
fun main() {
val nums = generateSequence(1) { it + 1 }
println(nums.takeWhile { it < 5 }.toList())
}無駄な計算を避ける
消費されるまで何も実行されず、消費も途中で停止できるため、高コストな変換は終端操作に実際に到達する要素に対してだけ適用されます。
fun main() {
val result = (1..100).asSequence()
.map { it * 2 }
.filter { it > 10 }
.take(2)
.toList()
println(result)
}シーケンスの再利用
ほとんどのシーケンスは複数回反復でき、そのたびにパイプラインが再実行されます。ただし、イテレーターのような一度しか読み取れないソースから作られたシーケンスは、1回しか消費できません。ソースの性質に注意してください。
fun main() {
val seq = sequenceOf(1, 2, 3).map { it * 2 }
println(seq.toList())
println(seq.sum())
}状態を持つ操作と持たない操作
ほとんどの操作は状態を持たず、要素を1つずつ処理します。一方、sortedやdistinctのように状態を持つ操作もあり、すべての要素をバッファーに保持するか走査する必要があるため、遅延処理の利点が小さくなります。
fun main() {
val result = sequenceOf(3, 1, 2, 1).distinct().sorted().toList()
println(result)
}遅延処理のメリット
遅延操作は、中間リストを省略してメモリを節約し、短絡評価によって処理時間も短縮します。データ量が大きく、終端操作で結果を絞り込むほど、メリットは大きくなります。
確認問題
シーケンスのチェーン内のラムダ式は、実際にはいつ実行されますか?
まとめ
遅延操作は、終端操作によって消費されたときにだけ実行されるパイプラインを構築します。これにより中間リストを避け、first、take、takeWhileによる短絡評価が可能になります。sortedのように状態を持つ操作には注意してください。次は、シーケンスがコレクションより適している状況を判断します。
よくある質問
「遅延操作」レッスンは無料ですか?
はい。「遅延操作」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「遅延操作」で何を学びますか?
中間リストを避けます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「遅延操作」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。