Java 8 lambdas

Agendado para ser lançado em 2013, Java 8 incluirá suporte a idiomas para funções lambda. Embora a especificação ainda está em fluxo, lambdas já estão implementados no JDK 8 binários.

button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ui.dazzle(e.getModifiers()); } });

Duran-san. não estou vendo lambdas (que exigem o novo operador “->” ) no exemplo que você deu. Acho que você queria dizer:

// Código em Java 1.2 e posterior
button.addActionListener(new ActionListener() {   
    public void actionPerformed(ActionEvent e) {   
        ui.dazzle(e.getModifiers());  
    }  
}); 
// Código equivalente em Java 8 (Lambdas) 
button.addActionListener ( e -> ui.dazzle (e.getModifiers()) );

Referência: http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html

Esse operador “->” é chamado de operador seta ?
O que ele faz ?

[quote=entanglement]Duran-san. não estou vendo lambdas (que exigem o novo operador “->” ) no exemplo que você deu. Acho que você queria dizer:

// Código em Java 1.2 e posterior
button.addActionListener(new ActionListener() {   
    public void actionPerformed(ActionEvent e) {   
        ui.dazzle(e.getModifiers());  
    }  
}); 
// Código equivalente em Java 8 (Lambdas) 
button.addActionListener ( e -> ui.dazzle (e.getModifiers()) );

Referência: http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html
[/quote]

“Boa observação, a gramatica muda como uma expressão matemática que foi aprimorada”

[quote=Lucas_Soares]Esse operador “->” é chamado de operador seta ?
O que ele faz ?[/quote]

Não importa muito o nome do operador (devem dar um nome oficial para ele mais tarde - nesse documento ele é realmente chamado de “arrow”, mas acredito que eles acabem chamando de “lambda” ou outra coisa mais cerimoniosa).

O que ele faz é o seguinte: define um método que pode ser chamado sem você ter de criar uma classe anônima e outras coisas burocráticas (semelhante a um “anonymous delegate” do C# ou um “lambda” do C++11). Na verdade, ele até aceita algumas coisas mais complexas. Por exemplo, você não precisaria definir certas variáveis locais do método que incorpora esse código como “final” (o que é o caso em classes anônimas).

Dê uma olhada nos exemplos que estão disponíveis no documento que deixei apontado ( http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html ).

Valeu.

Como provar Lambda ? button.addActionListener ( e -> ui.dazzle (e.getModifiers()) );

Ta ficando lindo…é só esperar o lançamento para começar a usar :wink:

Scala feelings :shock:

em scala se usa muito o =>

[code]public interface NCopies{
public List getCopies(T seed, int num);
}

//This code will give a compilation error,
//As the lambda is meaningless without a context
( (seed, num) -> {
List list = new ArrayList<>();
for(int i=0; i<num; i++)
list.add(seed.clone());
return list;
}).getCopies(new CloneableClass(), 5);

However, the following would be perfectly alright, because there is an assignment context for the lambda.

NCopies nCopies = (seed, num) -> {
List list = new ArrayList<>();
for(int i=0; i<num; i++)
list.add(seed.clone());
return list;
};

nCopies.getCopies(new CloneableClass(), 5);[/code]

Duran-san (se quiser seu nome em japonês, ele fica “ムルシオ・ヅラン”), poderia explicar o que você está citando do blog?

Pelo que imagino, ele está explicando que uma expressão lambda não existe sozinha mas depende de ser atribuída a uma variável ou então passada como parâmetro para algum método. É isso mesmo?