22 de setembro de 2013

Métodos como parâmetros - Java 8

O Java 8 que será lançado em breve e já possui versões de teste disponíveis para download tem uma novidade interessante, que é tratar métodos como objetos (criando assim o suporte a funções Lambda). Uma vez que métodos podem ser tratados como objetos, você pode passa-los como parâmetro ou cria-los em tempo de execução.

Vamos dissecar mais sobre essas novidades no decorrer do tempo, mas por enquanto vamos ver um exemplo do que podemos fazer. Antigamente, para ler um arquivo e imprimir o seu conteúdo linha a linha poderíamos fazer algo assim:

public class LeitorDeArquivo {
    public static void main(String[] args) {
    
        try(Scanner scanner = 
                new Scanner(new FileInputStream("/Users/lucaspolo/teste"))) {
                
            while(scanner.hasNext()) {
                System.out.println(scanner.next());
            }
            
        } catch (FileNotFoundException ex) {
            System.err.println("Problemas ao abrir e ler arquivo: " + ex.getMessage());
        }
}
Basicamente estamos dizendo o seguinte enquanto houver um próximo elemento, imprima este próximo elemento. No Java 8 podemos deixar menor ainda este trecho de código, invertendo a maneira como lidamos com este tipo de instrução, agora podemos dizer para os elementos seguintes, faça a seguinte operação, conforme o código abaixo, que possui o mesmo funcionamento:

public class LeitorDeArquivo {
    public static void main(String[] args) {
    
        try(Scanner scanner = 
                new Scanner(new FileInputStream("/Users/lucaspolo/teste"))) {
                
            scanner.forEachRemaining(System.out::println);
            
        } catch (FileNotFoundException ex) {
            System.err.println("Problemas ao abrir e ler arquivo: " + ex.getMessage());
        }
}
Repare que estamos passando o método println do objeto out da classe estática System como parâmetro. Perceba que o operador :: é responsável por esse passagem da referência do (a partir do Java 8) objeto println. 

O segredo ocorre no tratamento desse parâmetro recebido, ele converte em uma interface e injeta o seu objeto que no caso é uma String. No futuro veremos qual interface é essa e seu funcionamento por dentro.

Nenhum comentário:

Postar um comentário