Açúcar sintático Java - o significado da expressão lambda

1. A essência das expressões lambda

Expressões lambda e classes internas anônimas são realmente usadas para gerar uma instância de uma interface.

Em comparação com a implementação de uma interface por meio de uma classe e, em seguida, instanciar um objeto pela classe, as expressões Lambda e a sintaxe de classe interna anônima são mais concisas e você pode gerar uma instância da interface sem precisar definir a classe.

2. Gramática

Por exemplo, a interface de criptografia é a seguinte:

/**
 * 加密接口
 */
public interface IEncoder {
    
    
	/**
	 * 对数字加密
	 */
	public int encode(int num);
}

2.1 Criptografia por meio de classes

Para implementar um algoritmo de criptografia específico, a maneira mais comum é definir uma classe para implementar uma interface.O código a seguir é puramente uma operação normal e não precisa ser explicado.

/**
 * 加法加密
 */
public class AddEncoder implements IEncoder {
    
    
	@Override
	public int encode(int num) {
    
    
		return num + 1;
	}
	/**
	 * 测试
	 */
	public static void main(String[] args) {
    
    
		IEncoder encoder = new AddEncoder();
		int result = encoder.encode(1);
		System.out.println("加密结果:" + result);
	}
}

2.2 Criptografia por meio de classes internas anônimas

Se uma classe interna anônima for usada, não há necessidade de definir especificamente uma classe, apenas defina uma classe interna anônima quando necessário.

public class AnonymousDemo {
    
    
	public static void main(String[] args) {
    
    
		// 使用时临时定义类
		IEncoder encoder = new IEncoder() {
    
    
			@Override
			public int encode(int num) {
    
    
				return num + 1;
			}
		};
		int result = encoder.encode(1);
		System.out.println("加密结果:" + result);
	}
}

Para os objetos codificadores nos dois exemplos acima, seus recursos são realmente os mesmos e ambos são instâncias com métodos de criptografia aditivos. No entanto, em termos do método específico de geração desse objeto, a classe interna anônima pode ser usada temporariamente para personalizar o método de criptografia, que é mais leve do que definir especificamente uma classe.

2.3 Criptografia por meio de expressões Lambda

As expressões lambda são mais simples, mas essencialmente ainda geram uma instância de interface.

public class LambdaDemo {
    
    
	public static void main(String[] args) {
    
    
		// 通过表达式定义接口的实力
		IEncoder encoder = (num) -> {
    
    
			return num + 1;
		};
		int result = encoder.encode(1);
		System.out.println("加密结果:" + result);
	}
}

Como você pode ver, de fato, as expressões Lambda ainda estão mostrando a realização concreta de um método.

  • (num)Representa parâmetros
  • ->Indica que esta é uma expressão Lambda
  • {return num+1;}Bloco de código, escreva a lógica do método específico.

2.4 Abreviatura para expressão Lambda

Quando a lista de parâmetros tem apenas um parâmetro, os parênteses do parâmetro podem ser omitidos.

Quando há apenas uma instrução no bloco de código, o bloco de código pode ser omitido diretamente {}.

Quando há apenas um bloco de código return, ele também pode ser omitido.

Portanto, a expressão acima pode ser simplificada para:

public class LambdaDemo {
    
    
   public static void main(String[] args) {
    
    
   	// 通过表达式定义接口的实力
   	IEncoder encoder = num -> num + 1;
   	int result = encoder.encode(1);
   	System.out.println("加密结果:" + result);
   }
}

3. O significado da expressão Lambda

Classes internas anônimas e expressões Lambda são, na verdade, para simplificar o código de instanciação da interface.

Quando a instância da interface é usada apenas uma vez, é um desperdício escrever uma classe sozinha, é melhor fazer isso diretamente com uma expressão.

Lambda é mais simples do que classes internas anônimas, mas as expressões Lambda só podem enfrentar interfaces com apenas um método, enquanto funções anônimas podem suportar interfaces com qualquer número de métodos

4. Interface funcional

As expressões lambda podem suportar apenas uma interface de método, que pode ser chamada de interface funcional.

Java8 fornece uma anotação para interfaces funcionais @FunctionalInterfacepara verificar se a interface é funcional. Isso mostra a importância das interfaces funcionais!

A sintaxe é a seguinte:

/**
 * 加密接口
 */
@FunctionalInterface
public interface IEncoder {
    
    
	/**
	 * 对数字加密
	 */
	public int encode(int num);
}

Acho que você gosta

Origin blog.csdn.net/woshisangsang/article/details/107591447
Recomendado
Clasificación