Diferença entre map e flap_map no Ruby
Definições
Método map
O método executado em um array. Retorna um novo array, onde para cada elemento do array antigo ele executa o código específicado. Exemplo:
arr1 = [0,1,2,3,4,5]
# Multiplicar cada elemento do array por 2
arr1.map {|i| i*2}
=> [0,2,4,6,8,10]
# Elevar ao quadrado cada elemento do array
arr1.map {|i| i*i}
=> [0,1,4,6,16,25]
Método flat_map
O método executado em um array. Retorna um novo array, onde para cada elemento o valor retornado é a concatenação do resultado do bloco. Exemplo
arr1 = [0,1,2,3,4,5]
# Multiplicar cada elemento do array por 2
# e manter o valor original
arr1.flat_map {|i| [i, i*2]}
=> [0,0,1,2,2,4,3,6,4,8,5,10]
# Elevar ao quadrado cada elemento do array
# e manter o valor original
arr1.flat_map {|i| [i, i*i]}
=> [0,0,1,1,2,4,3,9,4,16,5,25]
# Elevar ao quadrado cada elemento do array,
# manter o valor original em uma mesmo posição
# do array pai
arr1.flat_map {|i| [[i, i*i]]}
=> [[0,0],[1,1],[2,4],[3,9],[4,16],[5,25]]
# Tornar o array mais "flat"
arr2 = [[1,2], [3,4]]
arr2.flat_map {|i| i}
=> [1,2,3,4]
Perfomance
Caso deseje comparar as perfomances de cada um dos métodos, você pode executar esse código na sua máquina e comparar os resultado
require 'benchmark/ips'
Benchmark.ips do |bm|
list = (0..10_000).to_a
bm.report "flat_map" do
list.flat_map do |x|
[x, x * x]
end
end
bm.report "map.flatten" do
list.map do |x|
[x, x * x]
end.flatten
end
bm.compare!
end
Resultados
Warming up --------------------------------------
flat_map 90.000 i/100ms
map.flatten 39.000 i/100ms
Calculating -------------------------------------
flat_map 883.196 (± 9.3%) i/s - 4.410k in 5.049088s
map.flatten 382.937 (± 2.9%) i/s - 1.950k in 5.096364s
Comparison:
flat_map: 883.2 i/s
map.flatten: 382.9 i/s - 2.31x (± 0.00) slower
- flat_map: documentação
- map: documentação
Opa, tudo bem? Antes de você ir, te deixo aqui meu email: [email protected]
Teve alguma dúvida?
Você achou que eu escrevi alguma coisa errada? Erro de português?
Você tem uma forma melhor de resolver o problema?
Você tem alguma sugestão de tópico para eu escrever?
Ou se quiser conversar sobre qualquer outro assunto?
Vamos trocar uma ideia. Sinta-se livre para me enviar um email. Eu lhe responderei com o maior prazer!