前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1 什么是Lambda表达式

1 什么是Lambda表达式

作者头像
用户7630333
发布2023-12-07 18:26:19
1280
发布2023-12-07 18:26:19
举报
文章被收录于专栏:look Java

1 什么是Lambda表达式

Runnable接口

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

代码结构

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

以上述代码为例:

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

使用Lambda简化

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

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

2 Lambda的语法规则

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

代码语言:javascript
复制
(参数类型 参数名称) -> {
代码体;
}

格式说明:

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

简单练习:

  • 无参
代码语言:javascript
复制
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注解

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

4 Lambda表达式的省略写法

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

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

接口

代码语言:javascript
复制
public interface StudentService {
    String show(String name, Long id) ;
}

代码实现

代码语言:javascript
复制
 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 什么是Lambda表达式
  • 2 Lambda的语法规则
  • 3 @FunctionalInterface注解
  • 4 Lambda表达式的省略写法
  • 5 Lambda表达式的使用前提
  • 6 Lambda和匿名内部类的对比
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档