Pesquisar este blog

terça-feira, 7 de outubro de 2014

Programação funcional com o Java 8. Fazendo funções com o Supplier

No java 8 existem duas interfaces que ajudam na programação funcional com o java e elas fazem parte do pacote java.util.function. Uma lista completa das classes deste pacote pode ser vista aqui.

Supplier

A interface supplier representa uma função que não contem nenhum argumento e produz um resultado de um tipo arbitrário. Uma implementação de Supplier pode referenciar um construtor.

Supplier referenciado por um construtor

Neste tipo de utilizacao, o supplier irá chamar direto um construtor da classe Usuario para instanciá-la.
Supplier<Endereco> supplierEndereco = Endereco::new;
Endereco endereco = supplierEndereco.get();
O :: new indica que o construtor da classe Endereco devera ser chamado. Neste caso estamos chamando o construtor sem argumentos da classe Endereco e o método get retornara o resultado da chamada a este construtor.

Supplier referenciado por um método estático 

Neste tipo de utilização, o supplier utiliza uma instancia de uma fábrica de enderecos para instanciá-lo.
Supplier<Endereco> supplierEndereco = FabricaEndereco::fabricaEndereco;
Endereco endereco = enderecoSupplier.get();

class FabricaEndereco {
  public static Endereco fabricaEndereco() {
    return new Endereco();
  }
}
Aqui basta indicarmos a classe da fábrica e o método que será utilizado para construir o endereço, separados pelo ::. FabricaEndereco é a classe da fábrica de endereços e fabricaEndereco é o método que será utilizado para construir a instância do endereço que será retornada pelo método get().

Supplier referenciando uma instancia

Esta é a forma de utilizar um método local para instanciar a classe endereço
Supplier<Endereco> enderecoSupplier = this::produtorDeEndereco;
Endereco endereco = enderecoSupplier.get();

private Endereco produtorDeEndereco(){
  return new Endereco();
} 
Assim como estamos acostumados a usar no java, o this neste caso indica que utilizaremos um método da instância corrente para construir uma nova instancia do Endereço, que neste caso é o método produtorDeEndereco. Para utilizar este tipo de criação do Supplier, a classe onde ele for utilizado, deverá ter um método produtorDeEndereco que retorne uma instância do endereço.

Nenhum comentário:

Postar um comentário