通俗理解Java中的Lambda表达式

Lambda

Lambda表达式支持将代码块作为方法参数, 允许使用更为简洁的方式实现抽象类或接口的抽象方法, 而不再是通过匿名内部类的方式, 它具有对某一方法重写或实现的功能;
接下来通过一个简单的例子了解一下

public class LambaExpressionDemo {
	public void eat(Eatable e) {
//		System.out.println(e); 
		e.taste();
	}
	public static void main(String[] args) {
		LambaExpressionDemo LED=new LambaExpressionDemo();
		//方式1:通过匿名内部类的方式实现Eatable接口的taste方法
		LED.eat(new Eatable() {
			@Override
			public void taste() {
				System.out.println("nice1");//匿名内部类重写taste方法
			}
		});
		//方式2: 通过Lambda表达式
		LED.eat(()->{System.out.println("nice2");});
	}
}
interface Eatable{
	void taste();
}

Lambda表达式只有一条语句,就可以省略大括号, 如上可写为: LED.eat( ()->System.out.println(“nice2”); );
上述代码中"->“前面的括号里的对应的就是需要重写接口方法的形参(即 taste() 括号中的 ), 后面”{}"中的对应的就是接口或抽象类的实现方法体, 若表达式需要返回值, return语句可以省略, 其实表达式在重写完抽象类/接口方法后返回重写后的匿名对象, 即使你没写return语句
Lambda只能为函数是接口创建对象 ( Lambda表达式最大的作用就是简化匿名表达式new …的操作 )
在Lambda表达式最前面可添加强制类型转换, 通过Lambda表达式返回匿名对象, 可对匿名对象向上/向下转型实现多态效果

Lambda的引用类方法
由于Lambda返回的是一个匿名对象, 其效果与匿名内部类的效果相同, 所以可对返回值进行引用操作
如上代码可进行改写:

Eatable eatable=()->{ System.out.println("nice3"); };
eatable.taste();
//使用接口的引用变量接收Lambda表达式的返回值, 再次通过接口的引用变量调用接口的实现方法

引用特定对象的实例方法
就是在"->"后面的重写的代码块中采用其他对象调用特定的方法

Eatable eatable=()->{ System.out.println("nice3");  A.functionName };
//通过特定对象A, 调用实例方法
eatable.taste();

引用某类对象的实例方法以及引用构造方法: 不做阐述, 与上面操作大致相同, 就是实现抽象类/接口的抽象方法(在"->"后面做相应的操作)

通过上述的操作发现Lambda表达式与匿名内部类具有一定的联系:

  1. Lambda就是对匿名内部类的一种简化操作, 可以部分取代匿名内部类
  2. Lambda与匿名内部类一致可以访问外部类的成员变量
  3. Lambda创建的对象和匿名内部类创建的对象一致, 可直接调用接口中继承的方法

他们二者的区别是:

  1. 匿名内部类可以为任意接口创建实例, 不管接口中具有多少个抽象方法, 但是Lambda只能为单个抽象方法创建实例
  2. 匿名内部类可以为抽象类或者普通类创建实例, Lambda只能为函数式接口创建实例
  3. 匿名内部类允许调用接口中的默认方法, 但是Lambda不行

最后再重复一遍
Lambda式子中,"->“前面的是需要实现的抽象方法的形参,没有形参就”()"为空处理,后面的是实现抽象方法的方法体

你可能感兴趣的:(Java)