Encadeando map, filter, reduce
Parte da seção Lógica e Fluxo do Journey de Swift da Coddy. Lição 26 de 56.
O verdadeiro poder desses três métodos é que eles podem ser compostos. Cada etapa transforma os dados e os passa para a próxima.
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) // 56Lendo de cima para baixo: mantenha os números pares, eleve-os ao quadrado e some os quadrados. Cada etapa é uma coisa óbvia, e a cadeia continua legível mesmo à medida que cresce.
Este formato de pipeline substitui um loop escrito manualmente por uma intenção explícita. filter significa "selecionar". map significa "transformar". reduce significa "agrupar".
Um leitor pode examinar a cadeia e ver o que está acontecendo sem rastrear variáveis de índice.
Uma regra rápida: a ordem importa. Filtrar antes de mapear dá menos trabalho do que mapear antes de filtrar quando o filtro é seletivo.
Desafio
MédioLeia uma única linha de entrada: uma lista separada por vírgulas de pares price:quantity. Por exemplo, 3:2,5:1,2:4,7:0 significa quatro pedidos.
Para cada pedido com quantity > 0, o total do item é price * quantity. Imprima três linhas:
- Os totais dos itens (somente para pedidos com
quantity > 0), unidos por, - O total geral desses totais de itens
- O número de pedidos que contribuíram (ou seja, com quantidade acima de zero)
Construa o pipeline com filter seguido de map e, em seguida, obtenha a contagem e a soma a partir do resultado.
Para a entrada 3:2,5:1,2:4,7:0, a saída é:
6,5,8
19
3Experimente você mesmo
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 para totais de linha; imprimir joined, sum, count
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de PalavrasPratique por conta própria: Playground de Swift