Encadenar map, filter, reduce
Parte de la sección Lógica y Flujo del Journey de Swift de Coddy. Lección 26 de 56.
El verdadero poder de estos tres métodos es que se pueden componer. Cada paso transforma los datos y se los entrega al siguiente.
let nums = [1, 2, 3, 4, 5, 6]
let result = nums
.filter { $0 % 2 == 0 } // [2, 4, 6]
.map { $0 * $0 } // [4, 16, 36]
.reduce(0, +) // 56
print(result) // 56Lectura de arriba abajo: conserva los números pares, elévalos al cuadrado y suma los cuadrados. Cada paso hace una cosa evidente; la cadena sigue siendo legible incluso cuando crece.
Esta estructura de canalización reemplaza un bucle escrito manualmente por una intención explícita. filter significa «seleccionar». map significa «transformar». reduce significa «combinar».
Un lector puede revisar la cadena y ver qué está sucediendo sin seguir las variables de índice.
Una regla rápida: el orden importa. Filtrar antes de aplicar map requiere menos trabajo que aplicar map antes de filtrar cuando el filtro es selectivo.
Desafío
IntermedioLee una sola línea de entrada: una lista separada por comas de pares price:quantity. Por ejemplo, 3:2,5:1,2:4,7:0 representa cuatro pedidos.
Para cada pedido con quantity > 0, el total de la línea es price * quantity. Imprime tres líneas:
- Los totales de
line(solo para los pedidos conquantity > 0), unidos mediante, - El total general de esos totales de
line - El número de pedidos que contribuyeron (es decir, con una cantidad superior a cero)
Construye la canalización con filter seguido de map; después, obtén count y sum a partir de result.
Para la entrada 3:2,5:1,2:4,7:0, la salida es:
6,5,8
19
3Pruébalo tú mismo
let orders = readLine()!.components(separatedBy: ",").map { pair -> (Int, Int) in
let parts = pair.components(separatedBy: ":")
return (Int(parts[0])!, Int(parts[1])!)
}
// TODO: filtrar quantity > 0, mapear a totales de línea; imprimir unidos, suma, conteo
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Strings a fondo
Conteo e índicesMayúsculas, minúsculas y TrimBúsqueda en StringsDividir y unirReemplazo de subcadenasResumen: Validación de usuario4Conjuntos
Crear conjuntosUnión e intersecciónResta y diferencia simétricaSubconjunto y superconjuntoResumen - Filtro de etiquetas7Proyecto - Seguimiento de hábitos
Descripción general del proyectoMarcar como completado10Proyecto - Motor de cuestionarios
Descripción general del proyectoHacer preguntas2Rangos e Intervalos
Cerrados vs. SemiabiertosSaltos (Stride)Métodos de RangosRangos en SwitchResumen - Cuadrícula de calendario5Funciones de orden superior Pt. 1
MapFilterReduceEncadenar map, filter, reduceResumen - Estadísticas de palabrasPractica por tu cuenta: Playground de Swift