O Java 8 é chamado de versão mais alterada da história do Java. Ele contém muitos novos recursos importantes, o mais núcleo é a adição de expressões Lambda e Streamapi. Os dois também podem ser usados juntos. Primeiro, vamos dar uma olhada no que é uma expressão de lambda.
O uso de expressões Lambda não apenas simplifica o código, mas também legível e, o mais importante, a quantidade de código também diminui muito. No entanto, até certo ponto, essas funções têm sido amplamente utilizadas em idiomas JVM, como o Scala.
Não é de surpreender que a comunidade Scala seja incrível, porque muito conteúdo do Java 8 parece ter sido transferido de Scala. Até certo ponto, a sintaxe do Java 8 é mais detalhada, mas não muito clara que a de Scala, mas isso não diz muito e, se puder, pode criar expressões de lambda como o Scala.
Por um lado, se o Java continuar desenvolvendo e implementando funções que o Scala já implementou em torno do Lambda, o Scala pode não ser necessário. Por outro lado, se fornecer apenas alguns recursos principais, como ajudar as classes internas anônimas, o Scala e outros idiomas continuarão a prosperar e poderá ultrapassar o Java. De fato, este é o melhor resultado. Somente com a competição pode haver progresso. Outros idiomas continuam a se desenvolver e crescer, e não há necessidade de se preocupar se eles estarão desatualizados.
Expressão de Lambda, a explicação na Wikipedia é um operador usado para representar funções e fechamentos anônimos. Eu sinto que essa explicação ainda é muito abstrata. Vejamos um exemplo.
classe pública swingtest {public static void main (string [] args) {jframe jframe = new jframe ("my jframe"); Jbutton jbutton = new jbutton ("meu jbutton"); jbutton.addactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent E) {System.out.println ("Button pressionado!");}}); jframe.add (jbutton); jframe.pack (); jframe.setVisible (true); jframe.setDefaultCloseoperation (jframe.exit_on_close); }}Este é um pedaço de código na programação de giro que vincula um evento de escuta ao botão. Quando o botão é clicado, o conteúdo "Buttonpressed!" será emitido no console. Aqui, criamos uma instância de uma classe interna anônima para vincular o ouvinte, que também é um formulário de organização de código relativamente comum no passado. Mas se olharmos de perto, descobriremos que, de fato, o que realmente estamos focando é um parâmetro e do tipo ActionEvent e o sistema de instrução.out.println ("ButtonPressed!"); saída para o console.
Se o código no programa anterior que cria uma classe interna anônima for substituída por uma expressão lambda, o código é o seguinte
classe pública swingtest {public static void main (string [] args) {jframe jframe = new jframe ("my jframe"); Jbutton jbutton = new jbutton ("meu jbutton"); jbutton.addactionListener (e -> system.out.println ("botão pressionado!")); jframe.add (jbutton); jframe.pack (); jframe.setVisible (true); jframe.setDefaultCloseoperation (jframe.exit_on_close);}} Preste atenção às alterações na parte do meio do código, nas 6 linhas de código originais, agora 1 linha pode ser implementada. Esta é uma forma simples de expressão de lambda.
Pode -se observar que a sintaxe da expressão lambda é
(param1, param2, param3) -> {// TODO}O programa de tipo do parâmetro aqui pode ser inferido com base no contexto, mas nem todos os tipos podem ser inferidos. No momento, precisamos exibir o tipo de parâmetro declarado. Quando há apenas um parâmetro, os colchetes podem ser omitidos. Quando a parte TODO tem apenas uma linha de código, os aparelhos do lado de fora podem ser omitidos. Como no nosso exemplo acima
Então, além do código conciso, a expressão de Lambda nos traz alguma alteração?
Lembre -se de que, em Java, não podemos passar uma função como um parâmetro para um método, nem podemos declarar que o valor de retorno é um método de uma função. Antes do Java 8, a resposta era sim.
Portanto, no exemplo acima, podemos passar uma lógica de código como um parâmetro para o ouvinte, dizendo ao ouvinte que você pode fazer isso quando o evento for acionado, sem a necessidade de usar classes internas anônimas como parâmetros. Este também é outro novo recurso trazido por Java 8: Programação Funcional.
Existem muitos idiomas que suportam programação funcional. No JavaScript, é muito comum passar funções como parâmetros ou retornar valores como funções. JavaScript é uma linguagem funcional muito comum.
A Lambda acrescenta recursos de programação funcional ausentes ao Java, permitindo tratar as funções como cidadãos de primeira classe.
Nas linguagens de programação funcional, o tipo de expressão de lambda é uma função. Em Java, as expressões lambda são objetos e devem ser anexadas a um tipo de objeto especial - interface funcional.
Em seguida, vejamos a definição da interface funcional:
Se houver e apenas um método abstrato em uma interface (os métodos na classe de objeto não estão incluídos), essa interface pode ser considerada uma interface funcional.
@FunctionInterfacePublic Interface Runnable {/** * Quando um objeto Implementando a interface <Code> Runnable </code> é usado * para criar um thread, iniciar o thread causa o método * <code> do objeto * </code> a ser chamado nessa execução separadamente * Thread. * <p> * O contrato geral do método <Code> Run </code> é que ele pode * tomar qualquer ação. * * @see java.lang.thread#run () */ public abstrate void run ();}Vamos dar uma olhada na declaração da interface executável. Após o Java 8, a interface executável possui uma anotação de interface funcional adicional, indicando que a interface é uma interface funcional. No entanto, se não adicionarmos anotação funcional -interface, se houver e apenas um método abstrato na interface, o compilador também considerará a interface como uma interface funcional.
@FunctionAlInterfacePublic Interface myInterface {void test (); String tostring ();}O MyInterface também é uma interface funcional, porque o ToString () é um método na classe de objeto, mas é reescrito aqui e não aumentará o número de métodos abstratos na interface.
(Para mencionar aqui, no Java 8, os métodos na interface podem não apenas ter métodos abstratos, mas também métodos implementados específicos. Eles são chamados de métodos padrão, que serão introduzidos em detalhes posteriormente)
Como em Java, as expressões lambda são objetos. Então, qual é o tipo desse objeto? Vamos revisar o programa SwingTest, onde uma instância de interface ActionListener é criada em uma classe interna anônima.
jbutton.addactionListener (new ActionListener () {@Override public void ActionPerformed (ActionEvent E) {System.out.println ("Button pressionado!");}});Melhorado com expressão de lambda
jbutton.addactionListener (e -> system.out.println ("botão pressionado!"));Ou seja, usamos a expressão do Lambda para criar uma instância da interface ActionListener e, em seguida, examinamos a definição da interface ActionListener.
Public Interface ActionListener estende o EventListener { /*** chamado quando ocorre uma ação. */ public void ActionPerformed (ActionEvent E);} Existe apenas um método abstrato. Embora a anotação funcional -interface não seja adicionada, ela também está em conformidade com a definição de uma interface funcional. O compilador considerará que essa é uma interface funcional.
Portanto, o uso de expressões lambda pode criar instâncias de interfaces funcionais. Ou seja, a expressão Lambda retorna um tipo de interface funcional.
De fato, existem três maneiras de criar instâncias funcionais da interface (consulte a anotação funcional -interface):
1. Expressões lambda
2. Citação do método
3. Referência do método construtor
Resumir
O exposto acima é sobre este artigo sobre o simples entendimento do Java 8 das expressões lambda e das interfaces funcionais. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la!