2019年2月19日火曜日

Kotlin メモ : reduce

reduce
reduceIndexed
reduceRight
reduceRightIndexed

reduce

inline fun <S, T : S> Iterable<T>.reduce(operation: (acc: S, T) -> S): S 蓄積値(acc)の初期値を最初の要素の値する
2番目の要素から順番に、現在の蓄積値(acc)と要素の値に対して operation を実行し、結果を次の蓄積値(acc)とする

やっていることを for で書くとこんな感じ var acc = list[0] for (index in 1 until list.size) { acc = operation(acc, list[index]) } ↓ だと operation は 4回呼ばれ、
1回目 : acc = list[0] = 1, i = list[1] = 2
2回目 : acc = 1 + 2 = 3, i = list[2] = 3
3回目 : acc = 3 + 3 = 6, i = list[3] = 4
4回目 : acc = 6 + 4 = 10, i = list[4] = 5
戻り値 : 10 + 5 = 15 val reduce = listOf(1, 2, 3, 4, 5).reduce { acc, i -> acc + i } println(reduce) ↓ 要素値をそのまま返せば前後の要素に対する処理(ここでは前後の要素の差分をリストにする)を行える val result = mutableListOf<Int>() listOf(1, 2, 3, 4, 5).reduce { acc, i -> result.add(i - acc) i } println(result) // [1, 1, 1, 1]

reduceIndexed

fun <S, T : S> Iterable<T>.reduceIndexed(operation: (index: Int, acc: S, T) -> S): S 処理の流れは reduce と同じで、operation に index も渡されるところが異なる

reduceRight

fun <S, T : S> List<T>.reduceRight(operation: (T, acc: S) -> S): S reduce と違って Iterable ではなく List の拡張関数(Array もある)

蓄積値(acc)の初期値が最後の要素の値で、最後から2番目の要素から戻る順番で operation が呼ばれる

↓ だと operation は 4回呼ばれ、
1回目 : acc = list[4] = 5, i = list[3] = 4
2回目 : acc = 5 + 4 = 9, i = list[2] = 3
3回目 : acc = 9 + 3 = 12, i = list[1] = 2
4回目 : acc = 12 + 2 = 14, i = list[0] = 1
戻り値 : 14 + 1 = 15 val reduce = listOf(1, 2, 3, 4, 5).reduceRight { acc, i -> acc + i } println(reduce)

reduceRightIndexed

fun <S, T : S> List<T>.reduceRightIndexed(operation: (index: Int, T, acc: S) -> S): S 処理の流れは reduceRight と同じで、operation に index も渡されるところが異なる


0 件のコメント:

コメントを投稿