为什么使用Lambda表达式

2023-11-16

1e242afad1264d37a2a3cbd1e65df2a0.jpg

 视频地址: https://b23.tv/gfH0PjR

在使用Lambda表达式之前,先看一下 匿名内部类的一个使用。

匿名内部类详情:http://t.csdn.cn/nMZpB

cffc26e18a4f4a8d83763c35f7adf725.jpg

    匿名内部类,就是没有名字的一种嵌套类。它是Java对类的定义方式之一,在实际开发中,我们常常遇到这样的情况:一个接口/类的方法的某个实现方式在程序中只会执行一次,但为了使用它,我们需要创建它的实现类/子类去实现/重写。此时可以使用匿名内部类的方式,可以无需创建新的类,减少代码冗余。

当我们new出了匿名内部类时,可以用类名当做参数进行传递。

虽然匿名内部类对于只需要执行一次的代码的方法的调用,已经相当简便,但是还是显得有一些冗余。这时Lambda表达式就再次简化了这个“痛点”5fdb1e21af1240cf9912a8c3e78259c6.jpg

     当然仅靠上面两行代码还是没有太大的“感觉”。

     假设现在有一个需求:获取当前公司大于35岁的程序员,然后进行统一开除

c6e6783db134476eb0b58860f2db9f21.jpg

创建员工实体类

b9b9a5dc8ed445278b883a66a15e084f.jpg

把员工信息放到一个List集合中

这里用到 Arrays.asList( )方法, 该方法是将数组转化成List集合的方法。

该方法详情:http://t.csdn.cn/rqFqo

b1401fbd54814b15b42f40db971606c4.jpg

写一个方法遍历上面的集合,并把大于等于35岁的员工放到一个新的员工集合并返回

c7d34e9117944eb2be948edc6bb23679.jpg

 

测试该方法,取出大于等于35岁的员工

f56e2106dd6145c38aabc025542ddca5.jpg

但是,当我们的需求改变为,查询出公司工资大于等于5K的员工开除时,就会发现可以把上面的代码完全复制过来,只改一下遍历集合的条件就行,对于秉持着“重复的代码只写一遍”的原则,这样简直不要太过冗余。

fc19fa8f9bdd40ffb39cc605d767f428.jpg

现在我们对代码进行进一步的优化,引入策略设计模式,给入某种策略方式就按照某种策略方式进行逻辑处理

策略设计模式详情:http://t.csdn.cn/6plTD

1 首先声明一个泛型接口

56260221a47242a2887836171058e930.jpg

2 创建一个实现类对该接口进行实现

1c1808c3537d4b5ea488a6b722326d81.jpg

3 写一个方法,参数是员工集合和声明的泛型接口d3601a00108c460e8c07573165c7272d.jpg

4 测试方法,调用filterEmployee()传入一个员工集合,和接口实现类5364d8e81dda42878a8d797ad9790493.jpg

当我们再次添加过滤条件时只需要再写一个实现类去实现带有泛型的接口,只是实现里面的抽象方法的返回条件不同d619758298b04bfb8c622eda262c96d0.jpg

然后在测试方法里面再次调用filtreEmoliyee()方法,同样传入一个员工集合和一个人接口实现类就可以得到一个不同过滤条件的不同员工集合

42303afe7d7b48c9b1f7554320494423.jpg

但是问题又来了,我们为了一段简短的代码去重新new了一个类,我说年轻人这样好吗?这不好,所以我们再次回到匿名内部类的形式,直接在filterEmployee()里面new MyPredicate调用test()方法传入Employee添加过滤条件,filterEmployee()返回一个过滤后的list集合,foreach遍历出过滤后的集合,这样我们就不需要去new一个实现类去实现MyPredicate接口再去实习抽象方法了。

42ecf0984b08477cadcfd3884b4ea65f.jpg

那么问题又来了,这样代码就优雅了吗?NO,别忘了我们今天的 “猪脚”是Lambda表达式

那么我们看一下用Lambda表达式对匿名内部类的优化,当然还是得调用 filterEmployee()方法。

dea8479462964f9e8c35d179e05e547c.jpg

从原本每个过滤条件都需要调用不同的filterEmployee()方法添加不同的过滤条件,里面代码简直是复制粘贴。到引入策略模式,只需要调用同一个filterEmployee()方法,通过形参传入不同的接口实现类。再到通过调用filterEmployee()方法传入一个匿名内部类,在匿名内部类中添加过滤条件。到最后的Lambda表达式只需要一行代码

List<Employee> list = filterEmployee(employee,(e)-> e.getsalary<=5000);

Lambda表达式的作用就不言而喻了。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用Lambda表达式 的相关文章

随机推荐

  • 关于C++中void*形参兼容问题,血的教训!

    关于C 中void 形参兼容问题 血的教训 C语言中void 作为形参的用法 C 中void 作为形参的用法 C语言中void 作为形参的用法 最近在实操一本算法书上的代码的时候 碰到了形如int comp void void 这样的形参列
  • 一种通用代码模型的构建与实现

    开发思路 总体开发思路 代码解析 需要考虑的问题是 目前已经实现了70 左右的功能 代码片段的内在结构 识别代码片段中所存在的对象元素 系统根据不同的对象元素的分类能快速执行相应的处理程序 将处理的结果进行传递 将处理过程进行缓存 保留代码
  • 程设课终章:c++使用socket实现bmp图片的传输

    特别鸣谢 44条消息 C UDP发送接收文件 BMP 我不在你不在的博客 CSDN博客 里面一些概念 ip地址 电脑门牌号 端口号 做这件事的行动代号 协议 接收方和发送方都必须遵守的一种规则 socket是基于tcp ip协议发送数据技术
  • 【vue其他相关】欢迎讨论!异步请求放在生命周期中的created还是mounted,已填坑

    文章目录 前言 两个生命周期 场景1 场景2 场景3 结论 如何处理场景一和场景二的问题 最后 前言 曾经在百度上搜这个问题 看到的答案都是相互复制粘贴的 而且个人觉得并没具体场景举例说明 并没有好的答案 于是自己立贴 留下这个坑 等日后遇
  • vue循环生成div

    遇到了一个需求 需要展示一年12个月的日历 然后一行为一个div 需要循环生成4个div 刚开始我查了一下 不知道怎么入手 然后问了我一个做前端的同学 一分钟就解决了 代码如下 div div div style width 500px b
  • pb 判断timer是否在执行_FreeRTOS 之 Timer

    在 FreeRTOS 之任务调度 一文中提到 硬件定时器是和硬件设计相关的 不同的芯片有不同的配置方法 通过中断方式触发执行 精确度高 相对于硬件定时器 FreeRTOS 中还提供了软件定时器 本文就来聊聊软件定时器是如何实现的 以及它的精
  • 类加载器的父委托机制

    类加载器 类加载器用来把类加载到Java虚拟机中 类加载器的类型 有两种类型的类加载器 1 JVM自带的加载器 根类加载器 Bootstrap 扩展类加载器 Extension 系统类加载器 System 2 用户自定义的类加载器 java
  • spring异常Unsatisfied dependency expressed through constructor parameter 0

    异常信息 org springframework beans factory UnsatisfiedDependencyException Error creating bean with name xxx defined in file
  • 程序员如何在浏览器上面去做p图软件的事

    在浏览器中更改内容除了箭头点击元素进行更改还有另一种更快捷的方法 首先随便打开一个浏览器 按f12 打开控制台 在控制台内输入一下代码回车 document designMode on 开启这个网站修改模式之后你就可以随心所欲地去更改网站的
  • 深度、广度优先搜索

    文章目录 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 应用 2 2 广度优先搜索 BFS 基本操作 应用 二 图的遍历 2 1 深度优先搜索 DFS DFS森林 Vertextype GetVex ALGraph G int v
  • ewiews面板回归模型操作_【视频教程】Eviews系列25

    点击上方关注我们 本期我们学习Eviews统计建模最后一部分 面板数据回归分析Hausman检验及本章常见问题解答 实操 Hausman检验判断是固定效应模型还是随机效应模型 上期我们讲到模型判断若选择模型2 需进一步通过Hausman检验
  • Qt: 信号与槽机制

    一 信号和槽机制是什么 1 Qt信号槽机制 是Qt的核心机制 它是Qt定义的一种对象间的通讯机制 且独立于标准C C 语言 2 信号 signals 当某个类对象发生内部改变时 发射 信号 随后与关联的 槽函数 被立即执行 信号槽机制 完全
  • Node快速切换版本、版本回退(降级)、版本更新(升级)

    场景 最近遇到一些node的坑 比如6 3 0版的node用不了公司最新的工作流 升级到10 x版的node后 又用不了另一套工作流 问题 怎么实现node版本降级 升级 是否可以安装多个版本按需要进行切换 解决方案 1 安装node版本管
  • 【FPGA项目】进阶版沙盘演练——报文收发(报文处理、CDC、CRC)

    前言 书接上文 FPGA项目 沙盘演练 基础版报文收发 子墨祭的博客 CSDN博客 前面我们做了基础版的报文收发 相信对逻辑设计有了一定的认知 在此基础上 继续完善一个实际报文收发可能会遇到的一些处理 报文处理 握手与反压 跨时钟域处理CD
  • 金币(代码)

    今天 先更一道题的代码 目录 题目描述 输入输出格式 输入格式 输出格式 样例 输入输出样例 1 输入 输出 输入输出样例 2 输入 输出 数据范围与提示 AC 代码 题目描述 国王将金币作为工资 发放给忠诚的骑士 第一天 骑士收到一枚金币
  • 什么是软连接,以及软连接在linux系统中的用法

    软连接是linux中一个常用命令 它的功能是为某一个文件在另外一个位置建立一个同步的链接 软连接类似与c语言中的指针 传递的是文件的地址 更形象一些 软连接类似于WINDOWS系统中的快捷方式 例如 在a文件夹下存在一个文件hello 如果
  • 微信小程序反编译微信小程序

    微信小程序反编译跳一跳 项目地址 https github com shunyue1320 decompile wx 反编译 wxapkg 文件 微信开发者工具打开
  • 【python】详解threading模块:Event类的使用

    测试代码 import threading import time event threading Event event set def func 1 print t1线程开启等待状态 event wait print t1线程并没有处于
  • 计算机网络-应用层

    1 概述 定义 为应用进程的通信提供服务 主要功能 文件传输 访问和管理 电子邮件 虚拟终端 查询服务和远程作业登录 重要协议 FTP SMTP POP3 HTTP DNS 应用层的两种模型 客户服务器模型 C S P2P模型 Peer t
  • 为什么使用Lambda表达式

    视频地址 https b23 tv gfH0PjR 在使用Lambda表达式之前 先看一下 匿名内部类的一个使用 匿名内部类详情 http t csdn cn nMZpB 匿名内部类 就是没有名字的一种嵌套类 它是Java对类的定义方式之一