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

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

この記事からわかること

  • Android/Kotlinreduce/sumof/foldメソッド使い方

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

コレクションの集約と合計を行うメソッド

Kotlinでコレクションの集約と合計を行えるメソッドは複数あり以下の通りです。それぞれの使い方と違いをまとめていきます。

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メソッド

foldreduceに初期値を指定できる機能が追加されたメソッドです。

val items = listOf("1", "2", "3", "4")

val result = items.fold("ADD:") { acc, item -> acc + item } // ADD:1234

違いまとめ

項目 sumOf reduce fold
主な用途 数値の合計を求める 任意の処理で集約 初期値付きの任意の集約処理
初期値の - なし
(リストの最初の要素が初期値)
あり
(引数で明示的に指定)
空リスト安全 安全 例外発生 安全
戻り値の型 数値型 コレクションの要素型 初期値で指定した型

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article