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

Lambda表达式常见用法(提高效率神器)

Java8中一个非常重要的特性就是Lambda表达式,我们可以把它看成是一种闭包,它允许把函数当做参数来使用,是面向函数式编程的思想,一定程度上可以使代码看起来更加简洁。

其实以上都不重要,重要的是能够提高我的开发效率,为了工作效率避免无意义加班,使用Lambda表达式只能说好爽!一时用一时爽,一直用一直爽!但是学习可能很多人觉得很复杂于是放弃了,可读性确实很不好,我的建议是死记规则,学习常用的Lambda表达式就够了。因为,其他稀奇古怪的语法很可能被你老大看见了会请你喝茶,所以本篇博客就由浅入深介绍提高工作效率神器——Lambda常用表达式。

例子切入

比如创建一个线程并启动,一般我们这样写:

//匿名内部类写法
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("内部类写法");}
}).start();

使用Lambda表达式可以这样写:

new Thread(() -> System.out.println("hello world")).start();

我知道你很急,但你先别急,后面我们详细介绍其用法。以上代码表明使用Lambda表达式写起来真的很爽,早写完早下班!如果你司是代码量绩效那别学了,先辞职再说![手动狗头]

使用场景

Lambda表达式的最最最常见的使用场景是 接口容器,凡是以后需要实现接口和操作容器都可以考虑使用Lambda表达式。实现接口需要注意,如果接口中仅有一个抽象方法需要实现可以使用Lambda表达式,否则有多个未实现的方法不能使用。上述例子也就是接口使用Lambda表达式的一种实现方式。下面分为接口和容器结合例子进行讲解。

接口

首先定义我们自己的接口,就是打印输入的字符串s,如下:

interface MyPrint{public void print(String s);
}

传统的实现方式就是需要实现MyPrint类然后重写print方法,这里就不再展示,我们直接使用Lambda表达式实现如下:

MyPrint myPrint = s -> System.out.println(s);
myPrint.print("hello world 1");

现在解释上述代码:等号左边是我们的接口类,使用多态的方式父类引用指向子类实现。那么右边就是我们对左边父类的实现。() -> {} 是Lambda的一个语法,()中的字符表示需要传入的参数,不需要写类型,使用占位符即可,如果()中没有参数表示该方法(指的是需要重写的方法)无参。{} 是方法体,具体的实现代码写在 {} 中。如果有多个参数可以写成 (a,b)->{return a+b} ,但是这还不够简介,记住:如果(a)只有一个参数那么不需要写 () 直接写 a,如果 {} 只有一行代码如果有return则不用写 return 也不用写 {},就写出一行需要返回的逻辑实现即可,例如上面代码实现标准写法是:

MyPrint myPrint = (s) -> {System.out.println(s)};

总结就是:能偷懒就偷懒,()->{} ,出错那你就按照标准的语法写,反正编译器会告诉你,如果只有一个参数可以省略() ,如果方法体只有一行代码可以省去return 单词和{} 。是不是超级简单,那么下面要升级难度了,
上述写法还可以进一步写成如下:

MyPrint myPrint = System.out::println; //等价于 s -> System.out.println(s);
myPrint.print("hello world 2");

这里就不得不介绍 :: 号的用法了,我们放到下一节讲解!

双冒号 :: 的用法

对于 :: 我的理解如下,假设有个Student类,其中有个方法 getName() ,那么student::getName 的意思就是 传入Student的对象student,调用它的getName()方法。等价于 (Student s)->{s.getName()} , 即

student::getName   等价于  (s)->{s.getName()} 或者  (Student s)->{s.getName()} 

所以,System.out::println 双冒号左边是对象,右边是该对象的方法。那有人会问那么参数s如何传的呢?我们再看,System.out::println; 等价于 s -> System.out.println(s); 其实println需要的是一个字符串参数,而MyPrint的print接口也是一个字符串参数,这种一对一的参数传递其实是隐式传递的,而且如果使用这种写法,参数必须是对应的!

以上情况是 对象::实例方法名; 那么也可以有 类名::静态方法名,例如 Integer::parseInt ,就是接受一个字符串,解析为整数。等价于 (String s)->{ Integer.parseInt(s)}。你会问你怎么知道参数是String,因为parseInt方法需要的就是String 啊。因此,如果你明白啦以上的规则,其实非常简单!现在还不适应没关系,通过下面的容器集合流处理案例,你会很明白!

Java 容器集合的Lambda用法

这里就非常简单了,基本都是Stream流的处理,配合Lambda表达式,简直写起来不要太爽了!这里还是以语法结合案例为驱动来讲解:

forEach 语法

使用它替代 for(int a : arr) ,简直太爽了,如下:

 // 使用Lambda表达式替代for循环List<Integer> arr = Arrays.asList(4, 1, 25);// forEach 表示从容器中依次取出每个元素进行{}中的操作arr.forEach(num->{int tmp = num+1;System.out.println(tmp);});
过滤器 stream().filter()

对容器中每个对象都进行过滤,如果filter( lambda条件)中的条件判断为true则保留,条件为false则丢弃。案例:提取容器中的奇数数字。

List<Integer> arr = Arrays.asList(4, 1, 25,3,6);
List<Integer> o = arr.stream().filter(num -> num % 2 == 1).collect(Collectors.toList());
System.out.println(o);

.collect(Collectors.toList() 表示重新转为List容器。

映射器 stream().map()

对容器中的每个对象都遍历,并对它在 map( lambda操作 ) 中进行一个Lambda表达式的操作,例子:每个数字变成自身的2倍(使用forEach也可以实现):

List<Integer> arr = Arrays.asList(4, 1, 25,3,6);
List<Integer> d = arr.stream().map(num -> 2 * num).collect(Collectors.toList());
System.out.println(d);
groupingBy 分组的使用

例子:将下面数组按照其字符串长度分组。

List<String> phones = Arrays.asList("huawei", "xiaomi", "vivo", "iphone","oppo", "laoluo", "oneplus");
Map<Integer, List<String>> map = phones.stream().collect(Collectors.groupingBy(String::length));
System.out.println(map);
综合练习题

最后来一道综合练习题,请先自己做,再看答案!
将一个字符串数组其中的字符串对应的奇数取出来,再转为整数类型,再排序
List list = Arrays.asList(“23”, “4”, “11”, “7”, “3”, “8”, “10”);
应该得到 [3, 7, 11, 23] .

List<Integer> res = list.stream().map(Integer::parseInt).filter(a -> a % 2 == 1).sorted().collect(Collectors.toList());
System.out.println(res);

以上就是 提高工作效率,但不能提高代码效率的常用Lambda表达式。对你有帮助的话帮忙一键三连,点赞-评论-关注!

相关文章:

Lambda表达式常见用法(提高效率神器)

Java8中一个非常重要的特性就是Lambda表达式&#xff0c;我们可以把它看成是一种闭包&#xff0c;它允许把函数当做参数来使用&#xff0c;是面向函数式编程的思想&#xff0c;一定程度上可以使代码看起来更加简洁。 其实以上都不重要&#xff0c;重要的是能够提高我的开发效率…...

2023旷视自驾感知算法暑期实习一面

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 1. 问下项目&#xff0c;问下我的情况 2. 是否了解最新的BEV算法&#xff0c;讲一下 3. 是否了解三维重建 4. 考察相机坐标系的转换 5. 手撕代码&#xff0c;翻车了&#xff0c;不考leetcode&#xff0c;考…...

Python3 如何实现 websocket 服务?

Python 实现 websocket 服务很简单&#xff0c;有很多的三方包可以用&#xff0c;我从网上大概找到三种常用的包&#xff1a;websocket、websockets、Flask-Sockets。 但这些包很多都“年久失修”&#xff0c; 比如 websocket 在 2010 年就不维护了。 而 Flask-Sockets 也在 2…...

SQLAlchemy常用数据类型

目录 SQLAlchemy常用数据类型 代码演示 代码分析 SQLAlchemy常用数据类型 SQLAlchemy 是一个Python的SQL工具库和对象关系映射(ORM)工具&#xff0c;它提供了一种在Python中操作数据库的高效方式。下面是SQLAlchemy中常用的一些数据类型&#xff1a; Integer&#xff1a;整形&…...

Vue路由与nodejs下载安装及环境变量的配置

目录 前言 一、Vue路由 1.路由简介 是什么 作用 应用场景 2.SPA简介 SPA是什么 SPA的优点 注意事项 3.路由实现思路 1.引入路由的js依赖 2.定义组件 3.定义组件与路径的对应关系 4.通过路由关系获取路由对象router 5.将路由对象挂载到实例中 6.触发路由事…...

HarmonyOS之 应用程序页面UIAbility

一 UIAbility介绍&#xff1a; 1.1 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互 1.2 UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面 二 UIAbility跳转和传参 2.1 页面间的导航可以通过页面路由router模块来实现。页…...

数据集笔记: Porto

数据来源&#xff1a;Taxi Trajectory Data_数据集-阿里云天池 (aliyun.com) 1 数据介绍 葡萄牙波尔图市运行的所有442辆出租车的全年轨迹&#xff08;从2013年7月1日至2014年6月30日&#xff09; 2 读取数据 import pandas as pdtrapd.read_csv(C:/Users/16000/Download…...

修改vscode底部栏背景和字体颜色

修改vscode底部栏背景和字体颜色 如图&#xff1a; 首先打开齿轮&#xff0c;打开设置搜索workbench.colorCustomizations,然后点击编辑setting.json修改setting.json内内容 "workbench.colorCustomizations": {"statusBar.foreground": "#FFFFFF…...

加速企业AI实施:成功策略和效率方法

文章目录 写在前面面临的挑战MlOps简介好书推荐 写作末尾 写在前面 作为计算机科学领域的一个关键分支&#xff0c;机器学习在当今人工智能领域中占据着至关重要的地位&#xff0c;广受瞩目。机器学习通过深入分析大规模数据并总结其中的规律&#xff0c;为我们提供了解决许多…...

【图论C++】树的重心——教父POJ 3107(链式前向星的使用)

》》》算法竞赛 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载…...

hhh百度地铁广告太搞笑了;24家国内大模型公司面经;LLM法律应用实践;AI+教育产品图谱与工作流 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f525; 会玩儿&#xff01;承包地铁专列&#xff0c;真人移动广告 | 百度世界大会预热 百度也是会玩儿&#xff01;承包了北京地铁一号线的「…...

项目管理:项目经理一定要避开这四大误区

项目经理要保质保量按时达成项目目标&#xff0c;需要关注项目的方方面面&#xff0c;要具有很强的沟通协调能力和目标意识。但是项目经理也不免不了失误&#xff0c;管理中的这四大误区&#xff0c;你经历过几个&#xff1f; 误区一&#xff1a;做不该做的事 你是否遇到这种…...

爬虫为什么需要 HTTP 代理 IP?

前言 爬虫在互联网数据采集、分析和挖掘中扮演着至关重要的角色&#xff0c;但是对于目标网站而言&#xff0c;频繁的爬虫请求可能会对其服务器产生不小的负担&#xff0c;严重的情况甚至会导致网站崩溃或者访问受限。为了避免这种情况的发生&#xff0c;同时也为了保护客户端…...

leetcode刷题笔记/代码随想录笔记——移除字符串中多余空格

1. 使用erase()函数 void removeExtraSpaces(string& s) {for (int i s.size() - 1; i > 0; i--) {if (s[i] s[i - 1] && s[i] ) {s.erase(s.begin() i);}}// 删除字符串最后面的空格if (s.size() > 0 && s[s.size() - 1] ) {s.erase(s.begi…...

dataGrip导出导入的方式

导出&#xff1a;选中需要导出的表 导入&#xff1a;选中导出的sql文件...

LeetCode279. 完全平方数

279. 完全平方数 文章目录 [279. 完全平方数](https://leetcode.cn/problems/perfect-squares/)一、题目二、题解方法一&#xff1a;完全背包二维数组方法二&#xff1a;一维数组&#xff08;空间复杂度更小的改进版本,最下面的两个版本不需要存储完全平方数&#xff09; 一、题…...

【CMake】add_dependencies 命令

【CMake】add_dependencies 原文链接&#xff1a;https://blog.csdn.net/new9232/article/details/125831009 参考链接&#xff1a;https://blog.csdn.net/new9232/article/details/121374943 简介 add_dependencies(<target> [<target-dependency>]...)官方文档…...

go语言unsafe.Pointer与uintptr

以下内容来源go语言圣经 1、unsafe.Pointer&#xff0c;相当于c语言中的void *类型的指针&#xff0c;如果需要运算需要转成uintptr类型的指针 2. uintptr uintptr是一个无符号的整型&#xff0c;它可以保存一个指针地址。 它可以进行指针运算。 uintptr无法持有对象, GC不把…...

ddos打到高防cdn上会发生什么

ddos打到cdn上会发生什么?当DDoS攻击打到CDN上时&#xff0c;肯定会影响网站的可用性和用户体验。具体DDoS攻击打到CDN上时&#xff0c;会发生以下情况&#xff1a; CDN节点负载增加&#xff1a;DDoS攻击会导致大量的无效流量涌入CDN节点&#xff0c;从而使得节点负载增加。这…...

【单调栈】503. 下一个更大元素 II

503. 下一个更大元素 II 解题思路 参考496. 下一个更大元素 I 首先计算nums2的每一个元素的下一个比他大的元素&#xff0c;使用单调栈 将上面的结果和nums2中的每一个元素组成映射map 针对每一个Nums1的元素 查询map 记录map 的value 但是这个是循环的数组元素 class So…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...