Em uma notícia de uns dias atrás nós anunciamos um novo curso, o Core Scala. Nele, havia um pequeno trecho de código:
Vamos entender como esse código funciona.
Para começar, temos uma lista de alunos. Como essa lista foi criada não é muito importante. Poderíamos ter recuperado ela de um banco de dados, ou tê-la criado em Scala com o seguinte código:
Com a lista pronta, basta fazer a iteração, e é aqui que acontece a parte mais interessante do exemplo.
Uma das principais características da linguagem Scala é o fato dela ser um linguagem que, além de Orientada a Objetos, também é Funcional. E o exemplo que estamos estudando explora bem isso.
No caso, filter é uma função que recebe como parâmetro uma outra função. Esta outra função pode ser uma definida em outro lugar, ou definida inline, que foi o que fizemos nesse caso. Aqui, a função declarada recebe um aluno como parâmetro e investiga seus atributos para verificar a idade.
Repare que falamos que a função recebeu apenas um aluno. A lista em si será responsável por percorrer todos os seus elementos e aplicar a função em todos eles, um a um. O resultado será uma nova lista, contendo todos os elementos da lista original que fizeram a nossa função retornar true como resultado - ou seja, que passaram no nosso critério de filtragem.
E isso é tudo. O interessante é que essa capacidade de passar funções para funções é muito usada na API de coleções de Scala. Podemos fazer filtros, transformações, splits, diversos tipos de iterações... Uma olhada no Scaladoc de Seq pode dar uma idéia melhor das possibilidades.
A título de curiosidade, como funções na forma como usamos acima é muito comum, podemos escrever ela com um atalho:
Gostaram? =)
----------
contatos:
blog: http://jcranky.com
twitter: http://twitter.com/jcranky
scaladores: http://scaladores.com.br
core scala: http://www.globalcode.com.br/treinamentos/cursos/core-scala
val alunosMaiores = alunos.filter(aluno => aluno.idade >= 18)
Vamos entender como esse código funciona.
Para começar, temos uma lista de alunos. Como essa lista foi criada não é muito importante. Poderíamos ter recuperado ela de um banco de dados, ou tê-la criado em Scala com o seguinte código:
case class Aluno(nome: String, idade: Int) val alunos = List(Aluno("joao", 19), Aluno("jose", 17), Aluno("maria", 21))
Criamos acima uma case class que é, de forma simplificada, equivalente a um Java Bean completo, com getters, setters, toString etc. Em seguida criamos a lista em si. Para isso, usamos um recurso de Scala que nos permite criar objetos com a sintaxe Classe(params) - sem o new. Este recurso está disponível para a nossa classe Aluno também pelo fato dela ser uma case class.
Com a lista pronta, basta fazer a iteração, e é aqui que acontece a parte mais interessante do exemplo.
Uma das principais características da linguagem Scala é o fato dela ser um linguagem que, além de Orientada a Objetos, também é Funcional. E o exemplo que estamos estudando explora bem isso.
No caso, filter é uma função que recebe como parâmetro uma outra função. Esta outra função pode ser uma definida em outro lugar, ou definida inline, que foi o que fizemos nesse caso. Aqui, a função declarada recebe um aluno como parâmetro e investiga seus atributos para verificar a idade.
Repare que falamos que a função recebeu apenas um aluno. A lista em si será responsável por percorrer todos os seus elementos e aplicar a função em todos eles, um a um. O resultado será uma nova lista, contendo todos os elementos da lista original que fizeram a nossa função retornar true como resultado - ou seja, que passaram no nosso critério de filtragem.
E isso é tudo. O interessante é que essa capacidade de passar funções para funções é muito usada na API de coleções de Scala. Podemos fazer filtros, transformações, splits, diversos tipos de iterações... Uma olhada no Scaladoc de Seq pode dar uma idéia melhor das possibilidades.
A título de curiosidade, como funções na forma como usamos acima é muito comum, podemos escrever ela com um atalho:
val alunosMaiores = alunos.filter(_.idade >= 18)
Gostaram? =)
----------
contatos:
blog: http://jcranky.com
twitter: http://twitter.com/jcranky
scaladores: http://scaladores.com.br
core scala: http://www.globalcode.com.br/treinamentos/cursos/core-scala
Comentários