Los métodos fold están muy relacionados a métodos que apliquen una función a una lista. Esto en muchos lenguajes se traducen en 2 métodos : Map y Reduce.
Map: Aplica una función a una lista, retornando otra lista que puede ser de diferente tipo. Transforma la lista.
Reduce: Aplica una función a una lista, acumulando o resolviendo un problema determinado, y retorna un valor.
Debemos recordar que una de las bases de la programación funcional donde provienen estos métodos es la inmutabilidad. Por lo tanto estos métodos retornan nuevas listas, sin modificar la existente.
En javascript :
const obtenerNombreDeCiudades = array => array.map(({ nombre }) => nombre);
const nombreDeCiudades = obtenerNombreDeCiudades (ciudadesPobladas);
const obtenerHabitantes = array => array.reduce((acumulador, { habitantes }) => acumulador + habitantes, 0)
const habitantesTotales = obtenerHabitantes(ciudades);
En java 8 :
En java podemos utilizar funciones map/reduce con Streams, veamos unos ejemplos:
String[] myArray = new String[]{"bob", "alice", "paul", "ellie"};
Stream<String> myStream = Arrays.stream(myArray);
Stream<String> myNewStream = myStream.map(s -> s.toUpperCase());
String[] myNewArray = myNewStream.toArray(String[]::new);
int myArray[] = { 1, 5, 8 };
int sum = Arrays.stream(myArray).sum();
String[] myArray = { "this", "is", "a", "sentence" };
String result = Arrays.stream(myArray).reduce("", (a,b) -> a + b);
En C# :
.NET implementa la operación de map/reduce con la extensión LINQ. Veamos un ejemplo:
map:
var result = numbers.Select(x => x + 3);
reduce:
var sum = number.Aggregate((x, y) => x + y);
Otra función muy importante es filter, filter permite filtrar listas, y claro :
En Javascript :
var rebels = pilots.filter(function (pilot) {
return pilot.faction === "Rebels";
});
var empire = pilots.filter(function (pilot) {
return pilot.faction === "Empire";
});
//con labmda
const rebels = pilots.filter(pilot => pilot.faction === "Rebels");
const empire = pilots.filter(pilot => pilot.faction === "Empire");
En Java :
Arrays.stream(myArray)
.filter(s -> s.length() > 4)
.toArray(String[]::new);
En C#:
List<Employee> e = employees.Where(
x => x.SickDays >= n).ToList();