当前位置: 首页 > article >正文

Lamda表达式

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);


http://www.kler.cn/a/5972.html

相关文章:

  • 减肥注意事项
  • 对于Redis的学习-Redis的数据结构
  • 【Go进阶】一篇文章带你了解 — 方法
  • 信息系统项目管理师第四版知识摘编:第17章 项目干系人管理​
  • PCB模块化设计14——MIPI模块PCB布局布线设计规范
  • rhel8/CentOS8/7 系统yum安装出现“未找到匹配的参数”、“没有可用软件包”错误的解决办法
  • ab性能测试工具的安装与使用
  • 留言板系统的设计与实现_kaic
  • 一文解析RISC-V SiFive U54内核——中断和异常
  • C#,初学琼林(06)——幂的常规算法与递归算法、模幂(幂模)的快速算法及其C#源程序
  • MySQL实战45讲——07|行锁功过:怎么减少行锁对性能的影响
  • Linux:磁盘管理
  • 一位程序员将一款开源工具变成了价值75亿美元的帝国
  • window安装Redis服务
  • 码住,虹科工业树莓派应用小tips
  • Vins 前端中高效的去畸变的方式解析
  • 适配器模式(结构型)
  • 2023年Visual Studio Code安装详细教程(含插件推荐)
  • 华为OD机试用java实现 -【RSA 加密算法】
  • 【AI绘画】如何使用Google Colab安装Stable Diffusion