Lamda表达式

本文介绍了Lambda表达式,一种简化编程的函数式编程思想在Java中的应用。Lambda表达式可被视为匿名函数,能作为参数传递,使得代码更加简洁。文章详细讲解了Lambda的格式、特征,并通过线程和比较器案例进行示例说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概况

Lambda表达式 --> 函数式编程(函数编程思想) 面向对象编程思想: 强调的是【对象】,必须通过对象的形式来做一些事情,一般情况下会比较复杂。

例如:多线程执行任务,需要创建对象,对象需要实现接口Runnable,我们想自己完成,需要将run方法中的代码传递给线程对象,这么麻烦?直接执行 不久好了吗?

函数编程思想:

函数需要得有输入量、输出量,使用输入量计算得到输出量,【拿什么东西做什么事】

就是为了尽量忽略对象的复杂用法---强调做什么,而不是以什么实行做,

同样执行线程任务,使用函数编程思想,可以直接通过传递一段代码给线程对象执行,不需要创建任务对象。

总之就一句话,函数编程思想可以通过一段代码完成面向对象想要做的代码量

可以将Lambda表达式理解为一个匿名函数; Lambda表达式允许将一个函数作为另外一个函数的参数; 我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码作为实参),也可以理解为函数式编程,将一个函数作为参数进行传递。

优点:

  1. λ 希腊字母表中排序第十一位的字母,英语名称为 Lamda

  2. 避免匿名内部类定义过多

  3. 可以让你的代码看起来很简洁

  4. 去掉了一堆没有意义的代码,留下核心的逻辑

  5. 其实质属于函数式编程的概念

2 Lambda表达式的格式

2.1 标准格式:

  • (参数列表) -> {代码}

  • (参数类型 参数名称) -> { 代码语句 }

  • ([Lambda参数列表,即形参列表]) -> {Lambda体,即方法体}

    特点:使用 "->"将参数和实现逻辑分离;( ) 中的部分是需要传入Lambda体中的参数;{ } 中部分,接收来自 ( ) 中的参数,完成一定的功能。

2.2 格式说明:

- 小括内的语法与传统方法参数列表一致,没有参数就留空,有多个参数就用逗号分隔

- 【->】 是新引入的语法格式,代表指向动作

- 大括号内的语法与传统方法体要求一致

(params)-> expression[表达式]
(params) -> statement[语句]
(params) -> {statements}

格式解析:

Lambda表达式格式:()->{}

1.小括号中书写的内容和接口中的抽象方法的参数列表一致

2.大括号中书写的内容和实现接口中的抽象方法体一致

3.箭头是固定的

2.3 重要特征

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。

  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。

  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。

Lambda的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意:

  1. 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。

    无论是JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。

  2. 使用Lambda必须具有上下文推断。

    也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

备注:有且仅有一个抽象方法的接口,称为“函数式接口”。

2.4 格式案例说明

(1) 线程案例

Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run () {
                System.out.println("线程需要执行的任务代码1");
            }
        });
        thread1.start();
 
        // Lambda表达式
        Thread t2 = new Thread(()->{
            System.out.println("线程需要执行的任务代码2");
        });
        t2.start();

(2) 比较器案例

    List<Integer> list = new ArrayList<>();
        Collections.addAll(list,11,22,33,44,55);
        System.out.println("排序之前的集合:" + list);
        
        // 比较器的正常书写格式
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare (Integer o1, Integer o2) {
                return o2-o1;
            }
        });
 
        // Lambda表达式
        Collections.sort(list,(Integer o1, Integer o2)->{return o2-o1;});
        System.out.println("排序之后的集合:" + list);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值