segunda-feira, 24 de janeiro de 2011

Trabalhando com closures no Java 8 - Java

java logoCriar em Java um simples Runnable ou ActionListenerpode ocupar muitas linhas de código. A solução preferida dos programadores hoje é usar as classes anônimas do Java:

Runnable r = new Runnable() {
public void run() {
System.out.println("Caelum");
}
};
new Thread(r).start();

Depois de muitas propostas para closures no Java, a proposta atual de Lambdas para o Java 8 permite omitir a declaração do método, no caso de haver apenas um método abstrato naquela classe abstrata/interface (single abstract method):

Runnable r = #{System.out.println("Caelum")};
new Thread(r).start();

Mais ainda: o compilador consegue inferir um passo adiante, descobrindo que há um construtor em Thread que recebe como argumento uma interface que possui apenas um método abstrato. Repare que agora não precisamos escrever nemRunnable, nem run:

new Thread(#{System.out.println("Caelum")}).start();

Esses recursos, somados aos polêmicos defender methods (que permitem indicar “defaults” para métodos em interfaces), permitirão escreverlista.sortBy(#Usuario.getNome), muito mais sucinto do que invocarCollections.sort(lista, ...) passando um new Comparator() {...}que invoca u1.getNome.compareTo().

Como rodar esses testes? O Java 7 está previsto já para junho, mas infelizmente não contemplará muitos dos esperados avanços na linguagem. Esses ficarão para meados de 2012, com o Java 8, mas você já pode experimentá-los. Para isso, precisa ter o Java 7 instalado (mac aqui). Depois precisa clonar o repositório dolangtools:

Para compilar esse projeto, de dentro de langtools/make, executamos o ant passando referência para os diretórios de instalação do seu Java 6 e Java 7:

ant -Dboot.java.home=/usr/lib/jvm/java-6-sun -Dtarget.java.home=/algumdiretorio/jdk1.7.0 build-all-tools

Para compilar nosso código que utilize esses recursos do Java 8, precisamos doclasses.jar gerado em dist/bootstrap/lib, que contem as classes necessárias para o compilador e também para a execução:

jdk1.7.0/bin/java -cp classes.jar com.sun.tools.javac.Main Classe.java

E para executar:

jdk1.7.0/bin/java -cp classes.jar:. Classe

Você já está pronto para verificar, criticar e comentar. A lista de discussão do projeto Lambda está bastante movimentada. E o que você achou das novidades do Java 8? Comente aqui no Blog e dê sua opinião.

Retirado de http://blog.caelum.com.br/trabalhando-com-closures-no-java-8/