Falando em Java 8, a primeira coisa que vem à mente é lambda (fechamento) e método de extensão virtual (método padrão). Esse recurso tem sido muito elogiado pelos principais sites de tecnologia e também é o primeiro recurso sobre o qual falaremos no. No início de nossa série Java 8 (JEP126 http://openjdk.java.net/jeps/126), algumas bibliotecas do jdk8 foram redesenhadas usando expressões lambda. Compreendê-lo é de grande importância para aprender os novos recursos do java 8.
1. Interface funcional
Interface funcional (a interface funcional também é chamada de interface funcional, mas na verdade é a mesma coisa). Simplificando, uma interface funcional é uma interface que contém apenas um método. Por exemplo, java.lang.Runnable e java.util.Comparator na biblioteca padrão Java são interfaces funcionais típicas. Java 8 fornece @FunctionalInterface como uma anotação. Esta anotação não é necessária, desde que a interface atenda aos padrões de interface funcional (ou seja, uma interface que contenha apenas um método), a máquina virtual a determinará automaticamente. é melhor usar a anotação @FunctionalInterface na interface para declará-la. Isso evita que outras pessoas da equipe adicionem novos métodos à interface por engano.
Lambda em Java não pode aparecer sozinho. Ele requer uma interface funcional para mantê-lo. O corpo do método de expressão lambda é na verdade a implementação da interface funcional.
2. Sintaxe Lambda
Contém três partes
1. Um parâmetro formal separado por vírgulas entre parênteses O parâmetro é o parâmetro do método na interface funcional.
2. Um símbolo de seta: ->
3. O corpo do método pode ser uma expressão ou um bloco de código. O corpo do método é a implementação do método na interface funcional. Se for um bloco de código, ele deve ser encapsulado com {} e um valor de retorno é necessário. há uma exceção If Se o valor de retorno do método em uma interface funcional for nulo, {} não será necessário.
No geral, é assim:
Copie o código do código da seguinte forma:
(parâmetros) -> expressão ou (parâmetros) -> { instruções };
Veja um exemplo completo para facilitar o entendimento
Copie o código do código da seguinte forma:
/**
* Teste a expressão lambda
*
*@autor benhail
*/
classe pública TestLambda {
public static void runThreadUseLambda() {
//Runnable é uma interface de função que contém apenas um método de execução sem parâmetros que retorna void;
//Portanto, não há parâmetros no lado esquerdo da expressão lambda e nenhum retorno no lado direito. Apenas imprime uma frase.
new Thread(() ->System.out.println("thread implementado por lambda")).start();
}
public static void runThreadUseInnerClass() {
//Não falarei muito sobre esse método. Era uma abordagem comum em versões antigas.
new Thread(new Runnable() {
@Substituir
execução void pública() {
System.out.println("Thread implementado pela classe interna");
}
}).começar();
}
public static void main(String[] args) {
TestLambda.runThreadUseLambda();
TestLambda.runThreadUseInnerClass();
}
}
Pode-se observar que o código desenhado com expressões lambda será mais conciso e legível.
3. Referência do método
Na verdade, é uma maneira simplificada de escrever uma expressão lambda. O método referenciado é na verdade a implementação do corpo do método da expressão lambda. O lado esquerdo é o contêiner (pode ser um nome de classe ou nome de instância). o meio é "::" e o lado direito é o nome do método correspondente. Conforme mostrado abaixo:
Copie o código da seguinte forma: ObjectReference::methodName
O formato geral de citação do método é
Se for um método estático, será ClassName::methodName. Como Object::equals
Se for um método de instância, será Instance::methodName. Tal como Object obj=new Object();obj::equals;
Construtor. É ClassName::new
Vejamos um exemplo completo para facilitar a compreensão:
Copie o código do código da seguinte forma:
importar java.awt.FlowLayout;
importar java.awt.event.ActionEvent;
importar javax.swing.JButton;
importar javax.swing.JFrame;
/**
*
*@autor benhail
*/
classe pública TestMethodReference {
public static void main(String[] args) {
Quadro JFrame = new JFrame();
frame.setLayout(novo FlowLayout());
frame.setVisible (verdadeiro);
JButton button1 = new JButton("Clique em mim!");
JButton button2 = new JButton("Clique em mim também!");
frame.getContentPane().add(botão1);
frame.getContentPane().add(button2);
//O parâmetro do método addActionListener aqui é ActionListener, que é uma interface funcional
//Use o método de expressão lambda
button1.addActionListener(e -> { System.out.println("Aqui está a implementação do Lambda"); });
//Use o método de referência do método
button2.addActionListener(TestMethodReference::doSomething);
}
/**
* Aqui está o método de implementação da interface funcional ActionListener
* @param e
*/
public static void doSomething(ActionEvent e) {
System.out.println("Aqui está a implementação de referência do método");
}
}
Pode-se observar que o método doSomething é a implementação da expressão lambda. A vantagem disso é que se você acha que o método lambda é muito longo e afeta a legibilidade do código, a referência do método é uma solução.
4. Resumo
O texto acima é todo o conteúdo da sintaxe da expressão lambda. Acredito que todos tenham uma certa compreensão das expressões lambda. No entanto, se o código for simples, não impressionará muitos espectadores. necessidade de introduzir lambda em java 8 é porque lambda As expressões podem simplificar o processamento de dados multithread ou multinúcleo em uma coleção e fornecer velocidade de processamento de coleção mais rápida. Este recurso do JEP126 será dividido em três partes. Há muitas coisas para escrever. Esta parte familiariza os leitores com a sintaxe e os conceitos de expressões lambda e referências de métodos. A segunda parte é sobre o conteúdo dos métodos de extensão virtual (métodos padrão). grandes coleções e soluções de dados. Descubra o poder das expressões lambda. Fique atento. . . .