【Kotlin/Android】reduce/sumof/foldメソッドの使い方!コレクションの集約と合計

この記事からわかること
- Android/Kotlinのreduce/sumof/
fold
メソッドの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Koala
- Kotlin:1.9.0
コレクションの集約と合計を行うメソッド
Kotlinでコレクションの集約と合計を行えるメソッドは複数あり以下の通りです。それぞれの使い方と違いをまとめていきます。
- sumof
- reduce
- fold
sumofメソッド
sumof
はコレクションの各要素の合計を取得できるメソッドです。扱えるデータ型は数値系のみでString型などを渡すとエラーになります。
val numbers = listOf(1, 2, 3, 4)
val total = numbers.sumOf { it } // 10
ラムダ内で要素を参照できるのでデータクラスのプロパティなどの合計を取得したりすることも可能です。
data class Product(val name: String, val price: Double)
val cart = listOf(
Product("りんご", 120.0),
Product("バナナ", 80.0),
Product("ぶどう", 150.0)
)
val totalPrice = cart.sumOf { it.price } // 350.0
reduceメソッド
reduce
はコレクションの各要素を集約した結果を取得できるメソッドです。もちろんsumof
と同じようにコレクションの合計値を算出することも可能です。reduce
ではラムダの引数に前回の値と次のコレクションの要素を受け取ることができます。
val numbers = listOf(1, 2, 3, 4)
val result = numbers.reduce { acc, item ->
// accが前回の結果
acc + item
} // 10
数値系だけという制約はないので文字列の連結などを行うことも可能です。
val strs = listOf("1", "2", "3", "4")
val result = strs.reduce { acc, item ->
acc + item
} // 1234
またreduce
は空のリストを渡してしまうとUnsupportedOperationException
エラーを吐いてクラッシュします。これは初期値として参照する最初のコレクションの値がないためです。
val emptyList = listOf<Int>()
val reduced = emptyList.reduce { acc, e -> acc + e }
// java.lang.UnsupportedOperationException: Empty collection can't be reduced
sumof
や後述しているfold
ではコレクションが空でも例外発生しません。またreduceOrNull
メソッドを使用することでnull
を返すようにすることも可能です。
val emptyList = listOf<Int>()
val reduced = emptyList.reduceOrNull { acc, e -> acc + e }
foldメソッド
fold
はreduceに初期値を指定できる機能が追加されたメソッドです。
val items = listOf("1", "2", "3", "4")
val result = items.fold("ADD:") { acc, item -> acc + item } // ADD:1234
違いまとめ
項目 | sumOf | reduce | fold |
---|---|---|---|
主な用途 | 数値の合計を求める | 任意の処理で集約 | 初期値付きの任意の集約処理 |
初期値の | - | なし (リストの最初の要素が初期値) |
あり (引数で明示的に指定) |
空リスト安全 | 安全 | 例外発生 | 安全 |
戻り値の型 | 数値型 | コレクションの要素型 | 初期値で指定した型 |
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。