Java细节--Lambda表达式与匿名内部类的联系和区别

Java细节–Lambda表达式与匿名内部类的联系和区别

我们知道,lambda表达式是匿名内部类的一种简化,因此它具有代替匿名内部类的作用

  • 相同点
  •  1.Lambda表达式与匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量
     (包括类变量和实例变量)
     2.Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法
    

下面代码演示相似之处:

@FunctionalInterface
//@FunctionalInterface声明函数式接口
package test;

@FunctionalInterface
//@FunctionalInterface声明函数式接口
interface Displayable{
	void display();
	default int add(int a,int b){
		return a+b;
	}
}
public class LambdaAndInner{
	private int age=12;
	private static String say="Java,世界第一编程语言";
	public void test(){
		String msg="我爱Java";
		Displayable dis=()->{
			System.out.println("msg局部变量为:"+msg);
			System.out.println("外部类的age实例变量为:"+age);
			System.out.println("外部类的say类变量为:"+say);
		};
		dis.display();
		System.out.println(dis.add(3,5));
	}
	public static void main(String []args){
		//var变量是jdk10的新特性,如果jdk小于这个版本将var换成LambdaAndInner
		var lambda=new LambdaAndInner();
		lambda.test();
	}
}

  • 区别
  •  1.匿名内部类可以为任意接口创建实例--不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可
     Lambda只能为函数时接口创建实例
     2.匿名内部类可以为抽象类甚至普通类创建实例
     Lambda只能为函数时接口创建实例
     3.匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法
     Lambda表达式则不能
     4.Lambda表达式形式上简单,便于编程
    

下述代码会错误

System.out.println(add(3,5));
Lambda 表达式和匿名内部类都是 Java 中用于创建短小、简洁的代码块,通常用作函数式接口(只有一个抽象方法)的实现。它们的主要区别在于: 1. **语法简洁性**: - **Lambda 表达式**:使用 `->` 运算符将参数列表和方法体直接连接,使得代码更加紧凑。例如,`x -> x * x` 表示接受一个参数并返回其平方的函数。 - **匿名内部类**:需要定义一个完整的类,尽管这个类可能只包含一个方法。例如,`new Runnable() { public void run() { ... } }`。 2. **类型推断**: - **Lambda 表达式**:编译器通常能够推断出 lambda 表达式的类型,特别是对于单方法接口,这提供了更灵活的使用。 - **匿名内部类**:如果方法体中有明确的类型声明,或者方法返回值不是 final,需要显式指定类型。 3. **可读性**: - **Lambda 表达式**:由于其简洁的语法,可能更容易理解。 - **匿名内部类**:对于复杂的类结构或多个方法,匿名内部类可能显得冗长。 4. **作用域和生命周期**: - **Lambda 表达式**:在方法调用结束时自动销毁,除非存储在引用中。 - **匿名内部类**:具有独立的生命周期,可以作为对象实例存在,直到垃圾回收。 5. **应用场景**: - **Lambda 表达式**:适合用于函数式编程风格,如 Java 8 中的 Stream API 和集合框架的操作。 - **匿名内部类**:更适合需要对象实例的场景,比如事件监听或作为构造函数的参数传递。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值