Kotlinには、リストのすべての要素を1つの値にまとめるための便利な関数 fold と reduce があります。これらを使うことで、集計処理や累積計算を簡潔に記述できます。
reduceの基本的な使い方
reduceは、リストの最初の要素を初期値として使用し、それ以降の要素を順番に処理しながら集約していきます。
Kotlin
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.reduce { acc, num -> acc + num }
println(sum) // 出力: 15この場合、最初の要素 1 が acc (累積値) に設定され、2, 3, 4, 5 を順に加算していきます。
reduceの注意点
- リストが空の場合、エラーが発生する
Kotlin
val emptyList = listOf<Int>()
val result = emptyList.reduce { acc, num -> acc + num } // 例外発生!- 初期値を設定できない(最初の要素が
accになるため)
foldの基本的な使い方
fold は 初期値を指定できる 点がreduceと異なります。
Kotlin
val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.fold(10) { acc, num -> acc + num }
println(sum) // 出力: 25ここでは、初期値 10 を指定しているため、リストの合計値 15 に 10 を加えて 25 になります。
foldを使うメリット
- リストが空でも安全(初期値があるためエラーにならない)
- 初期値を設定して累積計算を制御しやすい
foldとreduceの使い分け
reduce | fold | |
|---|---|---|
| 初期値 | 指定できない(リストの最初の要素がaccになる) | 指定できる |
| 空リスト | エラーが発生する | 初期値がそのまま返る |
| 用途 | そのまま累積計算したい場合 | 初期値を含めて処理したい場合 |
文字列の連結処理の例
Kotlin
val words = listOf("Kotlin", "Java", "Python")
val sentence = words.reduce { acc, word -> "$acc, $word" }
println(sentence) // 出力: Kotlin, Java, Python
val sentenceWithPrefix = words.fold("言語:") { acc, word -> "$acc $word" }
println(sentenceWithPrefix) // 出力: 言語: Kotlin Java Pythonfold を使うと、プレフィックスを追加する処理が簡単にできます。
まとめ
reduceはリストの最初の要素を累積値として使用するため、初期値なしで合計や計算を行いたいとき に最適。foldは 初期値を指定して累積計算を行いたい場合 に便利で、空リストでもエラーにならない。- どちらもデータの集約や変換に役立つため、適切に使い分けるとコードがシンプルにまとまる。
Kotlinのfoldとreduceを活用して、効率的なデータ処理を実現しましょう!

