fold、reduce、runningFold
fold、reduce、蓄積関数を使ってコレクションの要素を集約します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- mapとflatMap:すべての要素を変換する
- filter、filterNot、partition
- fold、reduce、runningFold
- パイプラインのチェーンとSequenceによる中間リストの回避