foldとreduceでリストの集約処理を効率化

Kotlin
記事内に広告が含まれる場合があります

Kotlinには、リストのすべての要素を1つの値にまとめるための便利な関数 foldreduce があります。これらを使うことで、集計処理や累積計算を簡潔に記述できます。

reduceの基本的な使い方

reduceは、リストの最初の要素を初期値として使用し、それ以降の要素を順番に処理しながら集約していきます。

Kotlin
val numbers = listOf(1, 2, 3, 4, 5)

val sum = numbers.reduce { acc, num -> acc + num }

println(sum) // 出力: 15

この場合、最初の要素 1acc (累積値) に設定され、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 を指定しているため、リストの合計値 1510 を加えて 25 になります。

foldを使うメリット

  • リストが空でも安全(初期値があるためエラーにならない)
  • 初期値を設定して累積計算を制御しやすい

foldとreduceの使い分け

reducefold
初期値指定できない(リストの最初の要素が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のfoldreduceを活用して、効率的なデータ処理を実現しましょう!

タイトルとURLをコピーしました