Qual é a diferença entre fold e reduce em Kotlin e quando usar cada um?
Olá! Recentemente comecei a estudar Kotlin e me deparei com as funções fold e reduce ao trabalhar com coleções. Entendo que ambas são usadas para agregação de elementos, mas não consigo captar a diferença.
Aqui está um exemplo que me confundiu. Suponha que eu tenha uma lista de números:
```kotlin
val numbers = listOf(1, 2, 3, 4, 5)
```
Posso calcular a soma com reduce:
```kotlin
val sumReduce = numbers.reduce { acc, i -> acc + i }
println(sumReduce) // 15
```
E com fold:
```kotlin
val sumFold = numbers.fold(0) { acc, i -> acc + i }
println(sumFold) // 15
```
O resultado é o mesmo. Mas notei que no fold eu passo um valor inicial (0), enquanto no reduce não. O que acontece se a lista estiver vazia? Tentei:
```kotlin
val emptyList = listOf()
// val result = emptyList.reduce { acc, i -> acc + i } // Erro!
val result2 = emptyList.fold(0) { acc, i -> acc + i }
println(result2) // 0
```
Parece que reduce lança um erro em lista vazia, enquanto fold funciona. Mas isso não é...