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 Python
fold
を使うと、プレフィックスを追加する処理が簡単にできます。
まとめ
reduce
はリストの最初の要素を累積値として使用するため、初期値なしで合計や計算を行いたいとき に最適。fold
は 初期値を指定して累積計算を行いたい場合 に便利で、空リストでもエラーにならない。- どちらもデータの集約や変換に役立つため、適切に使い分けるとコードがシンプルにまとまる。
Kotlinのfold
とreduce
を活用して、効率的なデータ処理を実現しましょう!