Programação, Scala

O map de Scala é preguiçoso (lazy evaluation)

Caso você não utilize o retorno de um map, seu corpo pode nunca ser executado. Esse fato pode surpreender iniciantes, especialmente aqueles não acostumados com avaliação retardada, ou “código preguiçoso”. Vejamos um exemplo para tornar o assunto mais claro:

val text = """ O Governo do Distrito Federal decretou nesta quarta-feira (31) estado de atenção devido à baixa umidade do ar."""

val rgx = “(?i)governo”.r

rgx.findAllIn(text) foreach { mat =>
println(“ENCONTREI, NO FOREACH ” + mat)
}

val ntx = rgx.findAllIn(text) map { mat =>
println(“ENCONTREI, NO MAP ” + mat)
mat
}

//val tamanho = ntx.size

Observe que a última linha foi comentada. Sem essa linha, teremos apenas a saída do foreach, mas não do map.

Por que?

Porque o corpo do map não foi avaliado, visto que o valor de retorno nunca foi usado. Na programação funcional, esse tipo de idioma é muito comúm: dizemos o que uma coisa é, ao invés do que ela deve fazer. Como o map(A => B) descreve um mapeamento entre uma coleção do tipo A para outra do tipo B, caso a coleção de tipo B não seja usada, o mapa não precisa executar o corpo do mapeamento. Este só é preciso caso os valores da coleção sejam aproveitados.

Por isso o map não pode sempre ser usado como loop foreach. O foreach é um loop imperativo que não tem valor de retorno, e o map é um loop funcional preguiçoso, que possui valor de retorno e seu comportamento depende do uso, ou não, desse valor.

Standard