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 件のコメント:
コメントを投稿