본문 바로가기
Back-End (web)

[Kotlin] Collection - Fold, Reduce

by 햄과함께 2022. 1. 16.
320x100

참고 : https://kotlinlang.org/docs/collection-aggregate.html#fold-and-reduce

 

Fold와 Reduce는 컬렉션 요소들의 연산결과를 누적해서 다음 연산에서 사용한다.

차이점은 Reduce는 처음 연산 때 첫번째, 두번째 element를 가져와서 연산을 하는 반면, Fold는 init 인자와 첫번째 element를 가져와서 연산을 한다.

val list = listOf(1, 2, 3, 4, 5)
list.reduce { prev, ele ->
  println("$prev, $ele")
  (prev + ele)
}
// 1, 2
// 3, 3
// 6, 4
// 10, 5

list.fold(0) { prev, ele ->
  println("$prev, $ele")
  (prev + ele)
}
// 0, 1
// 1, 2
// 3, 3
// 6, 4
// 10, 5

 

Fold

listOf(1, 2, 3, 4, 5)
  .fold(0) { prev, ele -> prev + ele } // 15
// 1 -> 3 -> 6 -> 10 -> 15
listOf(1, 2, 3, 4, 5)
  .foldRight(0) { ele, prev -> prev + ele } // 15
// 5 -> 9 -> 12 -> 14 -> 15

 

0 based-index

listOf(1, 2, 3, 4, 5)
  .foldIndexed(0) { idx, prev, ele ->
    // 인덱스가 짝수면 더한다.
    if (idx % 2 == 0) prev + ele 
    else prev
  } // 9
// 1 -> 1 -> 4 -> 4 -> 9
listOf(1, 2, 3, 4, 5)
  .foldRightIndexed(0) { idx, ele, prev ->
    // 인덱스가 짝수면 더한다.
    if (idx % 2 == 0) prev + ele 
    else prev
  } // 9
// 5 -> 5 -> 8 -> 8 -> 9

 

Reduce

listOf(1, 2, 3, 4, 5)
  .reduce { prev, ele -> prev + ele } // 15
// 3 -> 6 -> 10 -> 15
listOf(1, 2, 3, 4, 5)
  .reduceRight { ele, prev -> prev + ele } // 15
// 9 -> 12 -> 14 -> 15

 

0 based-index

listOf(1, 2, 3, 4, 5)
  .reduceIndexed { idx, prev, ele ->
    // 인덱스가 짝수면 더한다.
    if (idx % 2 == 0) prev + ele 
    else prev
  } // 9
// 1 -> 4 -> 4 -> 9
listOf(1, 2, 3, 4, 5)
  .reduceRightIndexed { idx, ele, prev ->
    // 인덱스가 짝수면 더한다.
    if (idx % 2 == 0) prev + ele 
    else prev
  } // 9
// 5 -> 8 -> 8 -> 9
320x100

댓글