Novidades do Java 8: Lambda Expressions

Pessoal,

A quem interessar. Fiz um post sobre lambdas do Java 8:

[quote=rodrigo.uchoa]Pessoal,

A quem interessar. Fiz um post sobre lambdas do Java 8:

http://rodrigouchoa.wordpress.com/2014/05/20/novidades-do-java-8-lambda-expressions/[/quote]
Gostei, agora tá nos favoritos, obrigado por compartilhar :smiley:

Ótimo artigo vou, inclusive, acrescentar com o referência nas minhas aulas.

E o Java realmente chegou muitíssimo atrasado para a festa. Mesmo o C++, que tem um processo de especificação teoricamente mais lento que o do Java, conseguiu chegar antes.

Um recurso que sinto falta no lambda das maiores partes da linguagem é a falta de possibilitar chamadas recursivas. Esse é um dos grandes trunfos da programação funcional.

No início do artigo, ali quando você cita o exemplo do Swing. Uma prática comum do Netbeans é chamar um método ao invés de escrever o código diretamente no listener, usando assim a primeira sintaxe que você citou:

botao.addActionListener(e -> botaoClick(e));

Opa, valeu pessoal!

[quote]
No início do artigo, ali quando você cita o exemplo do Swing. Uma prática comum do Netbeans é chamar um método ao invés de escrever o código diretamente no listener, usando assim a primeira sintaxe que você citou:

    botao.addActionListener(e -> botaoClick(e));  

Vini, tem toda razão! Assim é bem mais prático!

Abraços!

Vini,

Dei uma editada lá e coloquei essa forma que você comentou.

Abraços!

Muito bom :stuck_out_tongue:

Legal, a sequencia natural desse artigo seria um explorando o que pode ser feito nos streams. O gancho nesse seu artigo você já deu. :wink:

Infelizmente, os streams são uma pálida amostra do que o LINQ do C# faz. O Java entrou atrasado e entrou mau, tanto com esse recurso, quanto com os default methods (que não são nem tão poderosos e nem tão flexíveis do que os extension methods da concorrência).

Se java entrou tarde na festa, estou entrando mais tarde ainda rss… Tava procurando por aí sobre esse novo recurso no java pois vi no C# e fiquei maravilhado.
Enfim, muito bom o seu post Rodrigo. Agradecido demais.

E aproveitando o comentário, não entendi a sintaxe de um trecho de um código…

//encontrar o menor dos dois operadores (usando operador ternário)
Double result4 = Calculadora.calcular(666d, 777d, (a, b) -> a > b ? b : a);
System.out.println(result4); //666.0 

Não entendi a expressão… não estou familiarizado com essa interrogação e dois pontos…
Será que alguém poderia explicar melhor como essa sintaxe funciona?

A interrogação é um recurso antigo, que vem desde o Java 1. É uma espécie de if disfarçado, chamado operador ternário:

Essa expressão:

 a > b ? b : a

Significa:

[code]if (a > b)
return b;
else
return a;

[/code]

Já essa sintaxe

(a, b) -> 

É o mesmo que implementar a operação da calculadora através de interfaces.

Double result4 = Calculadora.calcular(666d, 777d, new OperadorDouble() { @Override public Double aplicar(Double a, Double b) { return (a > b) ? b : a; } }

legal mesmo, já adicionei nos favs aqui

[quote=ViniGodoy]A interrogação é um recurso antigo, que vem desde o Java 1. É uma espécie de if disfarçado, chamado operador ternário:

Essa expressão:

 a > b ? b : a

Significa:

[code]if (a > b)
return b;
else
return a;

[/code]

Já essa sintaxe

(a, b) -> 

É o mesmo que implementar a operação da calculadora através de interfaces.

Double result4 = Calculadora.calcular(666d, 777d, new OperadorDouble() { @Override public Double aplicar(Double a, Double b) { return (a > b) ? b : a; } }[/quote]

Valeu Vini, por incrível que pareça nunca tinha visto esse “tipo” de “if”.

Eu sei que o post é um pouco antigo, mas fiquei em uma dúvida em uma parte:

@FunctionalInterface
public interface OperadorDouble {
 
    public Double aplicar(Double a, Double b);
 
}

E depois…

 public static Double calcular(Double op1, Double op2, OperadorDouble operador) {
        return operador.aplicar(op1, op2); //delegar para o operador
    }

E depois a chamada:

Double soma = Calculadora.calcular(10.0, 20.0, ( num1 , num2) -> num1 + num2 );

Toda e qualquer functional interface vai ser minhas expressões lambda?
Eu entendi errado, ou é isso aí mesmo?

Eu que não sei se entendi direito sua pergunta. Mas acredito que a resposta seja sim. Somente interfaces funcionais podem ser usadas para criar expressões lambdas. Lembrando que não é obrigatório o uso da annotation @FunctionalInterface. Será considerada qualquer interface funcional aquela interface que possuir somente UM UNICO método ABSTRATO.

Eu me expressei errado e você respondeu o que eu queria saber. Obrigado Rodrigo.