0Pricing
Kotlin Academy · レッスン

シーケンスとコレクション

それぞれの利点を学びます

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

シーケンスとコレクション

シーケンスとコレクションはどちらも同じ関数型操作を提供しますが、評価のされ方が異なります。それぞれが適している状況を知ることで、効率的で読みやすいコードを書けるようになります。

積極評価されるコレクションの復習

コレクションは積極評価されます。すべての操作が全要素を処理し、すぐに新しいコレクションを生成します。小規模なデータに対しては、シンプルで高速です。

fun main() {
    val result = listOf(1, 2, 3).map { it + 1 }.filter { it > 2 }
    println(result)
}

遅延評価されるシーケンスの復習

シーケンスは遅延評価されます。操作はパイプラインを構築し、消費されたときに要素ごとに実行されるため、中間コレクションを作成せずに済みます。

fun main() {
    val result = listOf(1, 2, 3).asSequence().map { it + 1 }.filter { it > 2 }.toList()
    println(result)
}

コレクションが適している場合

小規模なコレクションや短いチェーンでは、通常、コレクションのほうが高速で分かりやすくなります。シーケンスでは要素ごとにオーバーヘッド(イテレーターの呼び出し)が発生するため、ごく小さなデータではメリットを上回ることがあります。

シーケンスが適している場合

データ量が大きい場合、チェーンが長い場合、または結果の一部(最初に一致する要素や先頭N個)だけが必要な場合は、シーケンスが適しています。大きな中間リストの作成を避け、処理を早期に停止できます。

fun main() {
    val firstEvenSquare = (1..1000000).asSequence()
        .map { it * it }
        .first { it % 2 == 0 }
    println(firstEvenSquare)
}

違いを測定する

大きな範囲を使ったこの例では、積極評価されるバージョンなら作成する100万要素の中間リストを、シーケンスなら作成せずに済むことが分かります。

fun main() {
    val seqResult = (1..1000).asSequence()
        .filter { it % 2 == 0 }
        .map { it * 3 }
        .take(3)
        .toList()
    println(seqResult)
}

メモリ使用量

積極評価されるチェーンでは、すべての中間リストを同時にメモリ上に保持します。シーケンスでは現在処理中の要素だけを流すため、長いパイプラインでもピーク時のメモリ使用量を低く抑えられます。

短絡評価のメリット

終端操作(first、find、any)が早期に完了できる場合、シーケンスは残りの要素をスキップします。一方、積極評価されるコレクションでは、すでにすべての要素を処理し終えています。

fun main() {
    val found = (1..100).asSequence()
        .map { println("checking $it"); it }
        .any { it == 3 }
    println("Found: $found")
}

状態を持つ操作に注意する

sorted、distinct、groupByのような操作はすべての要素を必要とするため、遅延処理の効果が小さくなります。このような操作が中心のパイプラインでは、シーケンスを使ってもメリットが得られない場合があります。

実践的な指針

経験則として、まずは分かりやすさを優先してコレクションを使います。大規模なデータを処理する場合、多数の操作をチェーンする場合、または結果の一部だけが必要な場合に、シーケンスへ切り替えてください。パフォーマンスが重要な場合は、必ず測定してください。

同じAPI、異なる仕組み

どちらも同じ操作名を共有しているため、通常はasSequence()を追加または削除し、終端操作としてtoList()を追加するだけで切り替えられます。そのため、パフォーマンスの検証を低リスクで行えます。

fun main() {
    val data = listOf(1, 2, 3, 4, 5)
    val asList = data.map { it * 2 }.filter { it > 4 }
    val asSeq = data.asSequence().map { it * 2 }.filter { it > 4 }.toList()
    println(asList == asSeq)
}

確認問題

シーケンスがコレクションより高速になる可能性が最も高いのは、どのような状況ですか?

まとめ

コレクションは積極評価され、小規模なデータや分かりやすさを重視する場合に適しています。シーケンスは遅延評価され、中間リストを作成せず短絡評価もできるため、大規模なデータ、長いチェーン、結果の一部だけが必要な場合に適しています。状態を持つ操作には注意してください。APIは共通しているため、切り替えも簡単です。これでシーケンスのコースは完了です。

よくある質問

「シーケンスとコレクション」レッスンは無料ですか?

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

「シーケンスとコレクション」で何を学びますか?

それぞれの利点を学びます ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「シーケンスとコレクション」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. シーケンスを使う理由
  2. シーケンスの作成
  3. 遅延操作
  4. シーケンスとコレクション
← Kotlin Academyに戻る