匿名内部类和Lambda表达式实现有参有返回值抽象方法

接口

package Demo4;

public interface Addable {
    int add(int x,int y);
}

测试类

package Demo4;

public class AddableDemo {
    public static void main(String[] args) {
        // 匿名内部类,创建接口对象,重载Addable接口add方法
        // 匿名内部类创建的类型可以是接口,也可以是抽象类,还可以是具体类
        useAddable(new Addable() {
            @Override
            public int add(int x, int y) {
                return x+y;
            }
        });
        // lambda表达式方法也是重载了方法,相比较于匿名内部类更简单清晰
        // 省略了方法名,省略了参数类型,接口名和函数名都一同省掉
        // 如果代码只有一行可再省略省略大括号和分号,
        // 如果有return,return也要省略掉
        useAddable((x,y)->x+y);
        // 为什可以省略因为javac的类型推断机制
        // 编译器能够根据上下文信息推断出参数的类型
    }
    private static void useAddable(Addable a){
        int sum = a.add(10,20);
        System.out.println(sum);
    }
}

注意:

  • 使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法

  • 必须有上下文环境,才能推导出Lambda对应的接口

    • 根据局部变量的赋值得知Lambda对应的接口

      Runnable r = () -> System.out.println("Lambda表达式");

    • 根据调用方法的参数得知Lambda对应的接口

      new Thread(() -> System.out.println("Lambda表达式")).start();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 和集合框架的操作。 - **匿名内部类**:更适合需要对象实例的场景,比如事件监听或作为构造函数的参数传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值