2019年2月19日火曜日

Kotlin メモ : reduce

reduce
reduceIndexed
reduceRight
reduceRightIndexed

reduce

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

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

reduceIndexed

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

reduceRight

  1. 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
  1. val reduce = listOf(12345).reduceRight { acc, i -> acc + i }  
  2. println(reduce)  

reduceRightIndexed

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


0 件のコメント:

コメントを投稿