Versão ALPHA! Este artigo está em versão 'Alpha' e, portanto, não foi ainda revisado corretamente

Uso de funções no Gen

Introdução

Em RelatarioDeAlunoGen usamos um objeto do tipo Aluno para gerar um RelatorioDeAluno. Mas e se precisarmos dado uma lista de objetos de tipo Aluno, gerar uma lista de RelatorioDeAluno. Precisaremos de outro Gen?

Se já temos como gerar um RelatorioDeAluno de um aluno, então poderíamos pensar em como chamar o método gerarDe() para cada item da lista e para cada RelatorioDeAluno gerado, adicioná-lo em outra lista, assim retornar o resultado esperado. Essa implementação pode ser feita numa classe separada ou em outro método dentro de RelatarioDeAlunoGen, aqui vamos analisar como será feita a implementação com a segunda opção.

RelatarioDeAlunoGen já está implementado e testado, então precisamos de um método com a seguinte assinatura:

List<RelatorioDeAluno> gerarDe(List<Aluno> aluno);

A ideia é o método acima chamar o método gerarDe(Aluno aluno), então podemos implementá-lo assim:

public List<RelatorioDeAluno> gerarDe(List<Aluno> alunos) {
  List<RelatorioDeAluno> relatorios = newArrayList();
  for (Aluno aluno : alunos) {
    RelatorioDeAluno relatorioDeAluno = gerarDe(aluno);
    relatorios.add(relatorioDeAluno);
  }

  return relatorios;
}

Utizando funções temos outra alternativa para implementar esse novo método. Funções entre outros usos, nos permite transformar uma coleção de objetos X, em objetos Y. No nosso caso, precisamos transformar uma lista de Aluno para uma lista de RelatorioDeAluno.

Para implementar esse método usando funções vamos utilizar recursos do Guava para trabalhar com programação funcional em Java.

Utilizando funções, podemos obter o mesmo resultado com o seguinte código:

public List<RelatorioDeAluno> gerarDe(List<Aluno> alunos) {
  return Lists.transform(alunos, new ToRelatorioDeAluno());
}

Abaixo a função que estamos passamos para o método transform():

private class ToRelatorioDeAluno implements Function<Aluno, RelatorioDeAluno> {
  @Override
  public RelatorioDeAluno apply(Aluno input) {
    return gerarDe(input);
  }
}

Na implementaçao do método usando função, chamamos o método transform() da classe List, para fazer a transformação que precisamos. Essa transformação ocorrerá de fato quando for necessário utilizarmos algum elemento da lista de RelatorioDeAluno, pois a função aplicada é lazyly. Para evitarmos o carregamento lazy da lista, é necessário copiar a lista retornada para uma nova lista, isso pode ser feito usando o método copyOf() da classe ImmutableList.

public List<RelatorioDeAluno> gerarDe(List<Aluno> alunos) {
  List<RelatorioDeAluno>  res = Lists.transform(alunos, new ToRelatorioDeAluno()); 
  return ImmutableList.copyOf(res);
}

Com isso garantimos que quando o método gerarDe() for chamado a função será aplicada no mesmo instante.

Códigos-fonte

RelatorioDeAlunoGenGuice.java


 
 

objectos, Fábrica de Software LTDA

  • R. Demóstenes, 627. cj 123
  • 04614-013 - Campo Belo
  • São Paulo - SP - Brasil
  • +55 11 5093-8640
  • +55 11 2359-8699
  • contato@objectos.com.br