Passando Funções como Argumentos
Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 45 de 65.
Na programação, as funções podem fazer mais do que apenas aceitar valores simples como números ou strings - elas também podem aceitar outras funções como parâmetros. Este conceito poderoso é chamado de função de ordem superior, e abre caminhos inteiramente novos para escrever código flexível e reutilizável.
Quando você passa uma função como um argumento, você está essencialmente dando a outra função a capacidade de decidir qual operação realizar. Pense nisso como dar uma ferramenta a alguém e deixá-la escolher como usá-la em diferentes materiais.
void processNumbers(List<int> numbers, Function operation) {
for (int number in numbers) {
operation(number);
}
}Neste exemplo, processNumbers recebe uma lista e uma função como parâmetros. O parâmetro de função operation pode ser qualquer função que aceite um número inteiro. Isso significa que você pode passar uma função que imprime números, os dobra ou realiza qualquer outra operação que você precise.
Essa abordagem torna seu código incrivelmente flexível – em vez de escrever funções separadas para cada operação possível, você escreve uma função que pode trabalhar com muitas operações diferentes, aceitando-as como parâmetros.
Desafio
FácilCrie um programa que demonstre a passagem de funções como argumentos ao construir um processador de números flexível. Seu programa criará diferentes funções de processamento e as passará para uma função processadora principal que aplica a operação a uma lista de números.
- Leia uma entrada de string contendo números separados por vírgulas (ex:
"1,2,3,4,5") - Leia uma entrada de string representando o tipo de operação (
"double","square", ou"increment") - Divida a primeira entrada em uma lista de strings e converta cada uma para um número inteiro
- Crie três funções separadas:
doubleNumber- recebe um número inteiro e o retorna multiplicado por 2squareNumber- recebe um número inteiro e o retorna multiplicado por ele mesmoincrementNumber- recebe um número inteiro e o retorna somado a 1- Crie uma função principal chamada
processNumbersque recebe uma lista de inteiros e uma função como parâmetros - A função
processNumbersdeve aplicar a função fornecida a cada número na lista e retornar uma nova lista com os resultados - Com base na entrada do tipo de operação, passe a função apropriada para
processNumbers - Exiba os resultados no formato exato mostrado abaixo
Por exemplo, se as entradas forem "2,4,6,8" e "double", seu programa deve exibir:
Number Processor
================
Original numbers: [2, 4, 6, 8]
Operation: double
Processing numbers...
Result: [4, 8, 12, 16]
Operation completed successfullySe as entradas forem "3,5,7" e "square", seu programa deve exibir:
Number Processor
================
Original numbers: [3, 5, 7]
Operation: square
Processing numbers...
Result: [9, 25, 49]
Operation completed successfullySe as entradas forem "10,20,30" e "increment", seu programa deve exibir:
Number Processor
================
Original numbers: [10, 20, 30]
Operation: increment
Processing numbers...
Result: [11, 21, 31]
Operation completed successfullySeu programa deve demonstrar o conceito de funções de ordem superior ao passar uma das três funções de operação como argumento para a função processNumbers. Use declarações condicionais para determinar qual função passar com base na entrada do tipo de operação. A função processNumbers deve iterar pela lista de entrada, aplicar a função fornecida a cada elemento e coletar os resultados em uma nova lista.
Folha de consulta
Funções de ordem superior são funções que podem aceitar outras funções como parâmetros, permitindo um código flexível e reutilizável.
Para passar uma função como argumento, defina um parâmetro do tipo Function:
void processNumbers(List<int> numbers, Function operation) {
for (int number in numbers) {
operation(number);
}
}Isso permite que você passe diferentes funções para realizar várias operações nos mesmos dados, tornando seu código mais modular e evitando a necessidade de escrever funções separadas para cada operação possível.
Experimente você mesmo
import 'dart:io';
void main() {
// Ler entrada
String? numbersInput = stdin.readLineSync();
String? operation = stdin.readLineSync();
// Converter entrada de string para lista de inteiros
List<int> numbers = numbersInput!.split(',').map((e) => int.parse(e.trim())).toList();
// TODO: Criar as três funções de operação (doubleNumber, squareNumber, incrementNumber)
// TODO: Criar a função processNumbers que recebe uma lista e uma função como parâmetros
// TODO: Usar estruturas condicionais para determinar qual função passar com base no tipo de operação
// TODO: Chamar processNumbers com a função apropriada e armazenar o resultado
// Exibir os resultados no formato exigido
print('Number Processor');
print('================');
print('Original numbers: $numbers');
print('Operation: $operation');
print('Processing numbers...');
// TODO: Imprimir a lista de resultados aqui
print('Operation completed successfully');
}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 & Fluxo
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário7Funções Avançadas
Funções AnônimasPassando Funções como ArgumentosEntendendo ClosuresIntrodução à RecursividadeFunção Recursiva: Contagem RegressivaFunção Recursiva: FatorialRecapitulação - Processador de Listas2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados Únicos