(1) 什么是Lambda表达式

1 什么是Lambda表达式

Runnable接口

@FunctionalInterface // 被该注解修饰的接口只能声明一个抽象方法
public interface Runnable {
    public abstract void run();
}

代码结构

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("新线程中执行的代码 :"+Thread.currentThread().getName());
            }
        }).start();// 不是用lambda的创建线程的写法

以上述代码为例:

  • 都知道 不能直接调用接口 要摸就是类实现接口 然后实例化调用方法
  • 或者直接采用 匿名类部类的方式 Lambda就是简化匿名类部类的写法
  • 传统的方式 一般都采用 上述代码 或则类似的

使用Lambda简化

当然还可以做到更加简化 在下面会详细介绍

new Thread(() ->{
            System.out.println("新线程中执行的代码 :"+Thread.currentThread().getName());
        }).start();

2 Lambda的语法规则

Lambda省去了面向对象的条条框框,Lambda的标准格式由3个部分组成:

(参数类型 参数名称) -> {
代码体;
}

格式说明:

  • (参数类型 参数名称):参数列表
  • {代码体;} :方法体
  • ->: 箭头,分割参数列表和方法体

简单练习:

  • 无参
public class Demo1Lambda {
    public static void main(String[] args) {
          // 开启一个新的线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("新线程中执行的代码 :"+Thread.currentThread().getName());
            }
        }).start();// 不是用lambda的创建线程的写法
        
        new Thread(() ->{ // 调用无参的方法
            System.out.println("新线程中执行的代码 :"+Thread.currentThread().getName());
        }).start();
        System.out.println("主线程中的代码:" + Thread.currentThread().getName());
    }
}

3 @FunctionalInterface注解

/**
* @FunctionalInterface
* 这是一个标志注解,被该注解修饰的接口只能声明一个抽象方法
* 多个会编译不通过
*/
@FunctionalInterface
public interface UserService {
void show();
}

4 Lambda表达式的省略写法

在lambda表达式的标准写法基础上,可以使用省略写法的规则为:

  1. 小括号内的参数类型可以省略
  2. 如果小括号内有且仅有一个参数,则小括号可以省略
  3. 如果大括号内有且仅有一个语句,可以同时省略大括号,return 关键字及语句分号。

接口

public interface StudentService {
    String show(String name, Long id) ;
}

代码实现

 public static void main(String[] args) {
     	goStudent((String name,Long id) ->{
            return name+id;
        });
     	// lambda简化后的代码
        goStudent((String name,Long id) -> name+id+666);
    }

	// 自定义的方法
    public static void goStudent(StudentService studentService){
        System.out.println(studentService.show("张三", 22L));
    }
  • 一般我们都会根据代码的可读性 适度的去简化

5 Lambda表达式的使用前提

Lambda表达式的语法是非常简洁的,但是Lambda表达式不是随便使用的,使用时有几个条件要特别注

  1. 方法的参数或局部变量类型必须为接口才能使用Lambda
  2. 接口中有且仅有一个抽象方法(@FunctionalInterface)

6 Lambda和匿名内部类的对比

Lambda和匿名内部类的对比

  1. 所使用场景的类型不一样
    • 匿名内部类的类型可以是 类,抽象类,接口
    • Lambda表达式需要的类型必须是接口
  2. 抽象方法的数量不一样
    • 匿名内部类所需的接口中的抽象方法的数量是随意的
    • Lambda表达式所需的接口中只能有一个抽象方法
  3. 实现原理不一样
    • 匿名内部类是在编译后形成一个class
    • Lambda表达式是在程序运行的时候动态生成class
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值