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

Lambda表达式使用及详解

一 Lambda表达式的简介

Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加简洁。

Lambda表达式的使用场景:用以简化接口实现。

关于接口实现,可以有很多种方式来实现。例如:设计接口的实现类、使用匿名内部类。 但是lambda表达式,比这两种方式都简单

package test;/*** @author: Mercury* Date: 2022/3/20* Time: 17:48* Description:Lambda表达式* Version:1.0*/
public class Test04 {public static void main(String[] args) {//使用lambda表达式实现接口Test test = () -> {System.out.println("test");};test.test();}
}interface Test{public void test();
}

二 Lambda表达式对接口的要求

虽然说,lambda表达式可以在⼀定程度上简化接口的实现。但是,并不是所有的接口都可以使用lambda表达式来简洁实现的。

lambda表达式毕竟只是⼀个匿名方法。当实现的接口中的方法过多或者多少的时候,lambda表达式都是不适用的。

lambda表达式,只能实现函数式接口

2.1 函数式接口

如果说,⼀个接口中,要求实现类必须实现的抽象方法,有且只有⼀个!这样的接口,就是函数式接口。

//有且只有一个实现类必须要实现的抽象方法,所以是函数式接口
interface Test{public void test();
}

2.2 @FunctionalInterface

是⼀个注解,用在接口之前,判断这个接口是否是⼀个函数式接口。 如果是函数式接口,没有任何问题。如果不是函数式接口,则会报错。功能类似于 @Override。
代码如下(示例)

@FunctionalInterface
interface Test{public void test();
}

三 Lambda表达式的语法

3.1 Lambda表达式的基础语法

lambda表达式,其实本质来讲,就是⼀个匿名函数。因此在写lambda表达式的时候,不需要关心方法名是什么。

实际上,我们在写lambda表达式的时候,也不需要关心返回值类型。

我们在写lambda表达式的时候,只需要关注两部分内容即可:参数列表和方法体

lambda表达式的基础语法:

(参数1,参数2,) -> {
方法体
};

参数部分:方法的参数列表,要求和实现的接口中的方法参数部分⼀致,包括参数的数量和类型。

方法体部分 : 方法的实现部分,如果接口中定义的方法有返回值,则在实现的时候,注意返回值的返回。

-> : 分隔参数部分和方法体部分。

package test;/*** @author: Mercury* Date: 2022/3/20* Time: 17:48* Description:Lambda表达式* Version:1.0*/
public class Test04 {public static void main(String[] args) {//使用lambda表达式实现接口//无参
//        Test test = () -> {
//            System.out.println("test");
//        };//有参
//        Test test = (name,age) -> {
//            System.out.println(name+age+"岁了!");
//        };
//        test.test("小新",18);//有参+返回值Test test = (name,age)  -> {System.out.println(name+age+"岁了!");return age + 1;};int age = test.test("小新",18);System.out.println(age);}
}//无参
//interface Test{
//    public void test();
//}//有参 无返回值
//interface Test{
//    public void test(String name,int age);
//}//有参 有返回值
interface Test{public int test(String name,int age);
}

3.2 Lambda表达式的语法进阶

  • 参数部分的精简

参数的类型
由于在接口的方法中,已经定义了每⼀个参数的类型是什么。而且在使用lambda表达式实现接口的时候,必须要保证参数的数量和类 型需要和接口中的方法保持⼀致。因此,此时lambda表达式中的参数的类型可以省略不写。

注意点:如果需要省略参数的类型,要保证:要省略, 每⼀个参数的类型都必须省略不写。绝对不能出现,有的参数类型省略了,有的参数类型没有省略。

//有参+返回值
Test test = (name,age)  -> {System.out.println(name+age+"岁了!");return age + 1;
};
int age = test.test("小新",18);
System.out.println(age);
  • 参数的小括号

如果方法的参数列表中的参数数量 有且只有⼀个,此时,参数列表的小括号是可以省略不写的。

注意事项:

  1. 只有当参数的数量是⼀个的时候, 多了、少了都不能省略。
  2. 省略掉小括号的同时, 必须要省略参数的类型
  • 方法体部分的精简
    当⼀个方法体中的逻辑,有且只有⼀句的情况下,⼤括号可以省略
Test test = name -> System.out.println(name+"test");test.test("小新");
  • return的精简

如果⼀个方法中唯⼀的⼀条语句是⼀个返回语句, 此时在省略掉大括号的同时, 也必须省略掉return。

Test test = (a,b) -> a+b;

四 函数引用

lambda表达式是为了简化接口的实现的。在lambda表达式中,不应该出现比较复杂的逻辑。如果在lambda表达式中出现了过于复杂的逻辑,会对程序的可读性造成非常大的影响。如果在lambda表达式中需要处理的逻辑比较复杂,⼀般情况会单独的写⼀个方法。在lambda表达式中直接引用这个方法即可。

函数引用:引用⼀个已经存在的方法,使其替代lambda表达式完成接口的实现

4.1 静态方法的引用

语法:类::静态方法

  • 在引用的方法后面,不要添加小括号。
  • 引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的⼀致
package test;/*** @author: Mercury* Date: 2022/3/20* Time: 18:17* Description:lambda表达式静态方法引用* Version:1.0*/
public class Test05 {public static void main(String[] args) {//实现多个参数,一个返回值的接口//对一个静态方法的引用,语法:类::静态方法Test1 test1 = Calculator::calculate;System.out.println(test1.test(4,5));}
}class Calculator{public static int calculate(int a,int b ){// 稍微复杂的逻辑:计算a和b的差值的绝对值if (a > b) {return a - b;}return b - a;}
}interface Test1{int test(int a,int b);
}

4.2 非静态方法的引用

语法:类::静态方法
注意事项:

  • 在引用的方法后面,不要添加小括号。
  • 引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的⼀致
package test;/*** @author: Mercury* Date: 2022/3/21* Time: 8:14* Description:lambda表达式对非静态方法的引用* Version:1.0*/
public class Test06 {public static void main(String[] args) {//对非静态方法的引用,需要使用对象来完成Test2 test2 = new Calculator()::calculate;System.out.println(test2.calculate(2, 3));}private static class Calculator{public int calculate(int a, int b) {return a > b ? a - b : b - a;}}
}
interface Test2{int calculate(int a,int b);
}

4.3.构造方法的引用

如果某⼀个函数式接口中定义的方法,仅仅是为了得到⼀个类的对象。此时我们就可以使用构造方法的引用,简化这个方法的实现。

语法:类名::new
注意事项:可以通过接口中的方法的参数, 区分引用不同的构造方法。

package com.cq.test;/*** @author: Mercury* Date: 2022/4/27* Time: 10:31* Description:lambda构造方法的引用* Version:1.0*/
public class Test {private static class Dog{String name;int age;//无参构造public Dog(){System.out.println("一个Dog对象通过无参构造被实例化了");}//有参构造public Dog(String name,int age){System.out.println("一个Dog对象通过有参构造被实例化了");this.name = name;this.age = age;}}//定义一个函数式接口,用以获取无参的对象@FunctionalInterfaceprivate interface GetDog{//若此方法仅仅是为了获得一个Dog对象,而且通过无参构造去获取一个Dog对象作为返回值Dog test();}//定义一个函数式接口,用以获取有参的对象@FunctionalInterfaceprivate interface GetDogWithParameter{//若此方法仅仅是为了获得一个Dog对象,而且通过有参构造去获取一个Dog对象作为返回值Dog test(String name,int age);}// 测试public static void main(String[] args) {//lambda表达式实现接口GetDog lm = Dog::new; //引用到Dog类中的无参构造方法,获取到一个Dog对象Dog dog = lm.test();System.out.println("修狗的名字:"+dog.name+" 修狗的年龄:"+dog.age); //修狗的名字:null 修狗的年龄:0GetDogWithParameter lm2 = Dog::new;//引用到Dog类中的有参构造,来获取一个Dog对象Dog dog1 = lm2.test("萨摩耶",2);System.out.println("修狗的名字:"+dog1.name+" 修狗的年龄:"+dog1.age);//修狗的名字:萨摩耶 修狗的年龄:2}
}

五 Lambda表达式需要注意的问题

这⾥类似于局部内部类、匿名内部类,依然存在闭包的问题。

如果在lambda表达式中,使用到了局部变量,那么这个局部变量会被隐式的声明为 final。是⼀个常量,不能修改值。

相关文章:

Lambda表达式使用及详解

一 Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加简洁。 Lambda表达式的使用场景:用以简…...

JAVA练习52-打家劫舍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-打家劫舍 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 2月16日练习内容 提…...

简单谈一谈幂等测试

1、什么是幂等测试 幂等是一个抽象的概念,在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同,即多次调用方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。幂等测试,则主…...

typescript复习笔记

数组类型-限定每一项的类型 //写法一 const arrNumber: number[] [1, 2, 3] const arrString: string[] [a, b, c] //写法二 const arrNumber2: Array<number> [1, 2, 3] const arrString2: Array<string> [a, b, c]联合类型 符号是 | //数组可以存放字符串或…...

webstorm开发electron,调试主进程方案

官网教程地址&#xff1a;https://www.electronjs.org/zh/docs/latest/tutorial/debugging-main-process 我只能说官网太看得起人了&#xff0c;整这么简易的教程…… 命令行开关 第一步还是要按要求在我们的package.json里加上端口监听&#xff1a;–inspect5858 我的命令…...

2W字正则表达式基础知识总结,这一篇就够了!!(含前端常用案例,建议收藏)

正则表达式 (Regular Expression&#xff0c;简称 RE 或 regexp ) 是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为"元字符"&#xff09;正则表达式使用单个字符串来描述、匹配一系列匹…...

自学web前端觉得好难,可能你遇到了这些困境

好多人跟我说上学的时候也学过前端&#xff0c;毕业了想从事web前端开发的工作&#xff0c;但自学起来好难&#xff0c;快要放弃了&#xff0c;所以我总结了一些大家遇到的困境&#xff0c;希望对你会有所帮助。 目录 1. 意志是否坚定 2. 没有找到合适自己的老师 3. 为了找…...

ASEMI中低压MOS管18N20参数,18N20封装,18N20尺寸

编辑-Z ASEMI中低压MOS管18N20参数&#xff1a; 型号&#xff1a;18N20 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;200V 栅源电压&#xff08;VGS&#xff09;&#xff1a;30V 漏极电流&#xff08;ID&#xff09;&#xff1a;18A 功耗&#xff08;PD&#x…...

[NetBackup]客户端安装后server无法连通client

client name处填写客户端主机名&#xff0c;server to use for backups and restores处填写server端名字&#xff0c;与hosts文件内保持一致&#xff1b;source client for restores处填写client主机名&#xff0c;与server端hosts文件中保持一致&#xff0c;与主机实际名称保持…...

黑马Java后端项目实战--在线聊天交友

【课程简介】 越来越多的系统都有消息推送的功能&#xff0c;如聊天室、邮件推送、系统消息推送等&#xff1b; 要实现消息推送就需要服务端在数据有变化时主动推送消息给客户端&#xff0c;本次课程将带大家使用websocket实现消息推送。 【主讲内容】 1.方法&#xff1a;如…...

【实战系列 2】Yapi接口管理平台Getshell-Linux后门权限维持与痕迹清除

文章目录 前言一、网站主页到Getshell二、SSH软链接后门三、Linux权限维持 --隐藏踪迹3.1 隐藏远程SSH登陆记录3.2、ssh软链接后门连接失败的原因以及解决办法3.3、隐藏踪迹-痕迹清楚3.3.1、隐藏历史操作命令3.3.2、隐藏文件/文件夹3.3.3、修改文件时间戳3.3.4、隐藏权限3.3.5、…...

设计模式之抽象工厂模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、抽象工厂模式是什么&#xff1f; 抽象工厂模式是一种创建型的软件设计模式&#xff0c;该模式相当于升级版的工厂模式。 如果…...

Kotlin新手教程一(Kotlin简介及环境搭建)

目录一、 什么是Kotlin&#xff1f;二、为什么要使用Kotlin&#xff1f;三、使用IntelliJ IDEA搭建Kotlin四、Kotlin使用命令行编译一、 什么是Kotlin&#xff1f; Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言&#xff0c;它也可以被编译成为 JavaScript 源代码&…...

【虚拟仿真】Unity3D打包WEBGL实现全屏切换

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 今天实现Unity3D打包WEBGL后实现按钮点击全屏和退出 全屏的实现…...

java对象内存结构分析与大小计算

java对象内存结构Java对象保存在堆中时&#xff0c;由三部分组成&#xff1a;对象头&#xff08;object header&#xff09;&#xff1a;包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。所有java对象都有一个共同的对象头格实例数据&#xff08;Insta…...

RabbitMQ学习(七):交换器

〇、前言在之前的内容中&#xff0c;我们创建了一个工作队列。我们假设的是工作队列背后&#xff0c;每个任务都恰好交付给一个消 费者(工作进程)。在今天的内容中&#xff0c;我们将做一些完全不同的事情——我们将消息传达给多个消费者。这种模式 称为 “发布/订阅”。为了说…...

cmd命令大全

文章目录变量输入输出逻辑命令符控制语句函数注释变量 在批处理中&#xff0c;变量全部是弱类型的&#xff0c;通常可以当做字符串处理 1.初始化定义 set varthis a var 2.获取变量值 %var% 3.链接 set varcat%var1%%var2% 4.截取 %var:~n,m% n是起点&#xff0c;m是长度&…...

Git的使用方法(保姆级)

一、安装git二、创建凭据 ①打开电脑的凭据管理器git:https://gitee.com是固定写法用户名、密码是你创建gitee的用户名、密码三、在gitee中创建一个仓库四、项目提交到仓库的方法①选择一个项目交由git管理按照步骤一中召唤小黑窗口输入 git init 就可以出现.git文件夹②右键选…...

TypeScript 学习之泛型

泛型使用 组件不仅能够支持当前的数据类型&#xff0c;同时也能支持未来的数据类型。就需要使用泛型。使用泛型就不会丢失类型信息&#xff0c;使用any会丢失类型信息。 function identity<T>(arg: T): T {return arg; }identity 添加了类型变量T, T 捕获用户传入的类型…...

新手学习node.js基础,node.js安装过程,node.js运行环境及javascript运行环境.

学习node.js1.什么是node.js?2.node.js中的javaScript运行环境3.node.js可以做什么&#xff1f;4. node.js学习思路5.node.js环境的安装6.如何在node.js中执行JavaScript代码1.什么是node.js? node.js是一个基于Chrome v8 引擎的JavaScript运行环境(后端) node.js官网 &…...

Maven的安装步骤(保姆级安装教程)

一、安装本地Maven 选择你需要的maven版本下载&#xff1a;官网下载传送门 我使用的是3.6.1版本&#xff1a;maven-3.6.1-bin.zip 二、安装 把下载好的maven压缩包解压到一个没有中文&#xff0c;空格或其他特殊字符的文件夹&#xff0c;如&#xff1a; 三、配置环境变量…...

Axure教程(一)——线框图与高保真原型图制作

前面我们学习了制作网页的技能&#xff0c;从这里开始我们来学习前端必备技能&#xff0c;就是用Axure来制作原型图&#xff0c;一方面我们能提前绘制出我们所需的页面&#xff0c;这在我们开发的时候能节省大量的时间&#xff0c;另一方面我们能通过给用户进行体验从而能够发现…...

wholeaked:一款能够追责数据泄露的文件共享工具

关于wholeaked wholeaked是一款功能强大的文件共享工具&#xff0c;该工具基于go语言开发&#xff0c;可以帮助广大系统管理员和安全研究人员在组织发生数据泄露的时候&#xff0c;迅速找出数据泄露的“始作俑者”。 wholeaked可以获取被共享的文件信息以及接收人列表&#x…...

动态规划——股票问题全解

引入 股票问题是一类动态问题&#xff0c;我们需要对其状态进行判定分析来得出答案 但其实&#xff0c;我们只需要抓住两个点&#xff0c;持有和不持有&#xff0c;在这两种状态下分析问题会简单清晰许多 下面将会对各个问题进行分析讲解&#xff0c;来解释什么是持有和不持…...

想做游戏开发要深入c/c++还是c#?

根据题主描述提三点建议&#xff1a; 先选择一个语言、选择一个引擎能入行确保精通一个及已入行的情况下&#xff0c;技多不压身不必想日后的”退而求其次“&#xff0c;现在的事情还没有开始做就想以后&#xff0c;太过虚无及功利了 下面是这三点的详细说明&#xff1a; 【选…...

【JMeter】【Mac】如何在Mac上打开JMeter

平常我们在Windows电脑里打开JMeter&#xff0c;只要双击JMeter.bat即可打开&#xff0c;那我换了Mac后&#xff0c;该怎么打开JMeter呢 一、命令行打开JMeter 1、打开JMeter路径 cd /Users/work/apache-jmeter-5.2/bin 2、运行JMeter sh jmeter 3、如果涉及到一些权限无…...

JAVA面试八股文一(并发与线程)

并发的三大特性原子性&#xff1a;cpu在执行过程不可以暂停然后再调度&#xff0c;不可以中断&#xff0c;要不全部执行完&#xff0c;要不全部不执行。可见性&#xff1a;当多个线程访问同一个变量时&#xff0c;一个线程改变了这个变量的值&#xff0c;其他线程能够立即看到修…...

C语言二级指针

目录一、1. 指针的作用2.二级指针3. 为什么要用二级指针一、 1. 指针的作用 内存的存储区就像一池湖水&#xff0c;数据就像池水里面的鱼&#xff0c;如果不用内存寻址的方式&#xff0c;那么当你找某个特定数据的时候&#xff0c;就相当于在一池湖水里找某一条叫做“张三”的…...

[java-面试]初级、中级、高级具备的技术栈和知识点

&#x1f31f;1.java初级1. Java基础知识&#xff1a;语法、包装类、泛型、数据结构和继承&#xff0c;以及基础API。2. Java开发工具&#xff1a;如Eclipse&#xff0c;NetBeans&#xff0c;Maven等。3. Java Web开发技术&#xff1a;如Servlet&#xff0c;JSP&#xff0c;Str…...

「5」线性代数(期末复习)

&#x1f680;&#x1f680;&#x1f680;大家觉不错的话&#xff0c;就恳求大家点点关注&#xff0c;点点小爱心&#xff0c;指点指点&#x1f680;&#x1f680;&#x1f680; 目录 第四章 向量组的线性相关性 &5&#xff09;向量空间 第五章 相似矩阵及二次型 &a…...

深圳 高端 建站公司/模板建站的网站

我有一台部署在 AWS 上的 Ubuntu 系统&#xff0c;在它的里面有一个脚本&#xff0c;这个脚本的原有目的是以一定间隔&#xff08;准确来说是每隔 1 分钟&#xff09;去检查某个特定服务是否正在运行&#xff0c;如果这个服务因为某些原因停止了&#xff0c;就自动重启这个服务…...

做网站网页版和手机版/百度免费建网站

题面描述了一种加密的方式&#xff0c;让coder按照要求解密~ 将字母分成三段&#xff0c;再将位置用数组储存~所谓的旋转其实就是右移~ #include"cstdio" #include"iostream" #include"cstring" using namespace std; int main() { int k1,k2,…...

电子商务网站开发实例/网络营销与策划实践报告

中国银行数据平台2.0改造升级 项目的进度已经接近尾声&#xff0c;回想起项目刚开始的那份期待已经落实&#xff0c;人生中的风景有很多走过一处就要为自己留念&#xff0c;今天就为这个项目留念一下 项目背景 中国银行北京分行的数据是依托中国银行总行的&#xff0c;总行每天…...

wordpress跳过短代码/广州市口碑seo推广外包

有时需引入外部字体&#xff0c;字体文件过大&#xff0c;页面加载很慢&#xff0c;故使用此方法压缩。 安装 npm install font-spider -g 使用 新建【font】目录&#xff0c;html文件&#xff0c;将项目里需要压缩的文字写入html&#xff1b;将字体文件放入目录&#xff1…...

唐山高端网站建设/国内重大新闻10条

author&#xff1a;skate time&#xff1a;2013/03/01 mysql在线无性能影响删除7G大表 如何在mysql数据库里删除7G(或更大)大表&#xff0c;使其又不影响服务器的io&#xff0c;导致性能下降影响业务。先不说其是mysql表&#xff0c;就是普通文件&#xff0c;如果直接rm删除&a…...

手机网站建设比较好的公司/百度指数批量

面试官的问题层出不穷&#xff0c;我们在面试的时候总会被问到一些没接触的东西&#xff0c;所以就需要一个比较全面的面试复习&#xff0c;今天我就分享一个Java全能面试通关手册&#xff0c;希望能在面试方面帮助到大家。 大厂面试题目录阿里一面1.说⼀下ArrayList和LinkedL…...