Kotlin Academy · レッスン

fold、reduce、runningFold

fold、reduce、蓄積関数を使ってコレクションの要素を集約します。

レッスン 3/414 ステップ

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

集約操作

fold と reduce はコレクションを 1 つの値に集約します。fold は初期値を受け取り、reduce は最初の要素を初期値として使用します。runningFold はすべての中間結果を返します。

fold の基本

fold(seed) { acc, x -> ... } は初期値から開始し、各要素をアキュムレーターと組み合わせます。

fun main() {
    val nums = listOf(1, 2, 3, 4)
    val sum = nums.fold(0) { acc, n -> acc + n }
    println(sum) // 10
}

数値以外の初期値を使う fold

初期値には任意の型を指定できます。fold を使って List<T> をまったく異なる結果に変換することも可能です。

fun main() {
    val words = listOf("hello", "world", "kotlin")
    val joined = words.fold("") { acc, w -> if (acc.isEmpty()) w else "$acc, $w" }
    println(joined) // hello, world, kotlin
}

reduce の基本

reduce は最初の要素を初期値として使用します。ラムダは一度に 2 つの要素を組み合わせます。

fun main() {
    val nums = listOf(2, 3, 4, 5)
    val product = nums.reduce { acc, n -> acc * n }
    println(product) // 120
}

空のリストでは reduce が例外をスロー

reduce には少なくとも 1 つの要素が必要です。安全性を優先する場合は reduceOrNull を使用するか、初期値を指定する fold を使用してください。

fun main() {
    val empty: List<Int> = emptyList()
    println(empty.reduceOrNull { a, b -> a + b }) // null
    println(empty.fold(0) { a, b -> a + b })       // 0
}

fold と reduce

異なる結果型やデフォルト値が必要な場合は fold を使用してください。結果型が要素型と一致し、リストが空でない場合は reduce を使用してください。

fun main() {
    val nums = listOf(1, 2, 3, 4)
    println(nums.reduce { a, b -> a + b })       // 10
    println(nums.fold(100) { a, b -> a + b })   // 110 (seed 100)
}

runningFold

runningFold はすべての中間アキュムレーターをリストとして返します。累積合計や段階的なパイプラインに便利です。

fun main() {
    val nums = listOf(1, 2, 3, 4)
    val running = nums.runningFold(0) { acc, n -> acc + n }
    println(running) // [0, 1, 3, 6, 10]
}

累積合計の例

よくある分析パターンである、前月からの累積合計です。

fun main() {
    val monthly = listOf(100, 150, 80, 200, 120)
    val cumulative = monthly.runningReduce { acc, x -> acc + x }
    println(cumulative) // [100, 250, 330, 530, 650]
}

fold で Map を構築

可変マップに値を蓄積して、リストを Map に fold します。

fun main() {
    val words = listOf("apple", "banana", "cherry")
    val byLetter = words.fold(mutableMapOf<Char, MutableList<String>>()) { acc, w ->
        val key = w[0]
        acc.getOrPut(key) { mutableListOf() }.add(w)
        acc
    }
    println(byLetter)
}

fold で List を構築

fold を使って、シーケンスを構造化されたリストに変換できます。たとえば、連続する重複要素をグループ化できます。

fun main() {
    val nums = listOf(1, 1, 2, 3, 3, 3, 4)
    val grouped = nums.fold(mutableListOf<MutableList<Int>>()) { acc, n ->
        if (acc.isEmpty() || acc.last().last() != n) acc.add(mutableListOf(n))
        else acc.last().add(n)
        acc
    }
    println(grouped) // [[1, 1], [2], [3, 3, 3], [4]]
}

foldIndexed

各要素とともにインデックスも渡します。位置を考慮した集約に便利です。

fun main() {
    val nums = listOf(10, 20, 30)
    val weighted = nums.foldIndexed(0) { i, acc, n -> acc + (i + 1) * n }
    // 1*10 + 2*20 + 3*30 = 140
    println(weighted)
}

reduceRight

reduceRight は右から左へ集約します。文字列の連結順序など、操作が可換でない場合に重要です。

fun main() {
    val words = listOf("a", "b", "c", "d")
    val leftToRight = words.reduce { acc, w -> "$acc-$w" }
    val rightToLeft = words.reduceRight { w, acc -> "$w-$acc" }
    println(leftToRight)   // a-b-c-d
    println(rightToLeft)   // a-b-c-d (same here but operation matters)
}

クイックチェック

すべての中間アキュムレーター値を含むリストを返す関数はどれですか?

まとめ

fold は初期値(任意の型)を使って集約します。reduce は最初の要素を初期値として使用するため、空でないコレクションが必要です。runningFold / runningReduce はすべての中間値を返します。合計、積、マップの構築、グループ化、段階的な変換に使用してください。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「fold、reduce、runningFold」レッスンは無料ですか?

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

「fold、reduce、runningFold」で何を学びますか?

fold、reduce、蓄積関数を使ってコレクションの要素を集約します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「fold、reduce、runningFold」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. mapとflatMap:すべての要素を変換する
  2. filter、filterNot、partition
  3. fold、reduce、runningFold
  4. パイプラインのチェーンとSequenceによる中間リストの回避
← Kotlin Academyに戻る