java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda...

article/2025/11/11 10:57:22

我们都知道, java8之后增加了很多新特性,大大的简化了代码的编写、阅读的负担。

先发个牢骚:

今天up主根据自己的理解跟大家说说新特性之一的lambda express(拉姆达表达式),每当看到新的语法改动,内心我都是拒绝的。因为又要学习、又要适应、又要改变真烦人,可是没办法现在这几乎是所有大厂必须的操作。总不能看不懂人家写的代码吧,做IT行业尤其是软件工程师必须要保证自己的知识及时更新、知识面不但要广而且还要专。只有这样才不会被日新月异所淘汰,熟不知现在JDK都升级了14了,我们连jdk8都还没搞明白岂不是太说不过去了。要记住:危机感、危机感、危机感

1. 什么是lambda表达式?

说白了就是匿名函数的简单抽象,那啥是匿名函数啊?

百度是这么说的:匿名函数不以文件形式驻留在文件夹上;他的生成方式最简捷,可在指令窗或任何函数体内通过指令直接生成。

说白了就是没有单独的方法定义结构,可在任何方法直接通过 new的方式进行创建使用。那下面代码举例:

//定义一个普通的接口FunInterface1 里面有一个抽象方法m1() ,常规做法我们想用接口中的方法必须要通过关键字implements对其接口进行实现,然后重写m1方法。其实更简单的调用可以用匿名函数的方式实现,代码如下:

interface FunInterface1 {

void m1();

}

interface FunInterface2 {

int m2(int a,int b);

}

public class NoNameFun {

public static void main(String[] args) {

FunInterface1 fun1 = new FunInterface1() {

@Override

public void m1() {

System.out.println("我是m1的具体实现!");

}

};

fun1.m1();

}

}

以上是常规的匿名函数的调用,那我们用java8 的lambda的方式从写一下,对比看看:

FunInterface1 fun2 = ()->{System.out.println("我是m1");};

fun2.m1();

我们发现用lambda的方式改进后变成了两行代码, 是不是大大的简化了程序的阅读性。其中()代表了函数的参数部分,由于m1是无参的所以是空的。->表示指向的意思,{}大括号中写具体业务逻辑实现代码。从以前的new  FunInterface1()简化为()-> 。

调用有参数的接口方法代码如下:

FunInterface2 fun3 = (int a,int b)->{return a+b;};

System.out.println(fun2.m2(3,5));  //结果输出8

是不是很简洁,好的东西我们一定要学习。我们再看一个线程的例子:

new Thread(()->{

System.out.println("线程执行体");

},"线程名称").start();

就几行代码就创建好了一个线程。很easy吧,动起手来尝试一下。

2. 为什么lambda表达式不用写函数名称?

相信大家看完上面的代码会有疑惑。

为什么不写函数名称lambda就知道要实现哪个方法呢?

首先lambda表达式使用的时候是有要求的,如果接口有且仅有一个方法(default、static除外一会详解),那么可以直接使用。因为只有一个(only one)方法,所以编译器会直接知道要实现哪个方法。如果多于一个方法,那么在使用lambda表达式的时候会报编译错误,例我们在FunInterface1 又新增抽象方法m2(),会出现以下错误:f43b1a3e6f2a32ba9b8d30b317104484.png多个没有重写的抽象方法被发现

所以为了避免以上问题,java标准规范中定义说,函数式接口需要用@FunctionalInterface注解来标示。如果接口中只有一个方法,那么不加注解,编译器会自动识别。如果FunInterface1 加上了@FunctionalInterface注解,那么会直接报编译错误,不允许增加第二个抽象方法,不符合标准规范。那么真的不能加第二个甚至更多的方法嘛,很显然不是的。java8还新增了static、default这两种修饰的接口方式,就是说从java8开始,接口中方法可以有自己的实现体了,代码如下:

b47f1abb0daaf2477829387337827c19.pngdefault和static类型的方法可以有多个

更神奇的是,可以与@FunctionalInterface兼容。允许一个函数式接口中有且仅有一个抽象方法,多个default方法和多个static方法。代码如下:ae08475d69f3f0e8aa03044a3f7a7bd3.png没有编译错误,且能正常执行

不得不说java编程语言的强大,灵活可扩展。

如何调用?我们以FunInterface3接口为例

1cbc1f6a9cdada44c3947488a089bd11.png注意static方法的调用形式

2.如何熟练使用lambda表达式?

总结个口诀:

1.接口引用先

2.之后方法参

3.一横右箭头

4.大括号来实现

总结:第一次写文章,逻辑性和表达性欠缺希望大家能多多体谅。也希望此文能帮助到正在学习Java的同学们,大家一起努力。


http://chatgpt.dhexx.cn/article/lnHsY4XF.shtml

相关文章

拉姆达表达式学习(1)

我曾经遇到一个项目,项目里面需要经常对一系列的同类型集合进行操作,如对集合进行增加元素,删除集合的指定索引的元素等等.    我们可以使用ArrayList来进行.如 1 ArrayList stringListnew ArrayList(); 2 stringList.Add("大家好"); 3 stringList.Add("你们好…

拉姆达表达式记录 + log日志+代码

目录 71. item.label $"{lstD[i].DeptName}({lstCamera.Count})";72. 定义entity时不写传统的{get;set;}73.74. EF多对多75. DateTime.Now.Subtract(x.GpsTime).TotalHours76. queryModel.LogDate.Value.Year77. .net导出Excel78. User.Ident…

List.sort()方法使用拉姆达表达式进行排序的一个例子

这是牛客网华为java题库的一道题:HJ26 字符串排序 题中要求,对字符串中的英文字母不分大小写按照字典顺序排序,遇到相同的字母,要求保持它们的相对顺序不变,非英文字母字符保持原位置不变。例如: 输入&…

拉姆达表达式

1、Queryable 用于拉姆达表达式操作 //---------Queryable<T>,扩展函数查询---------// //---------Queryable<T>,扩展函数查询---------////针对单表或者视图查询//查询所有 var student db.Queryable<Student>().ToList(); var studentDynamic db.Querya…

java 拉姆达表达式_Java8中foreach与拉姆达表达式的组合使用

1. forEach and Map 1.1 通常这样遍历一个Map Map items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E", 50); items.put("F", 60)…

Matlab系列之数组(矩阵)的生成

从本篇开始&#xff0c;会有一段时间都将用于记录数组、矩阵的操作等等&#xff0c;如果以前没有接触过相关的&#xff0c;可能会觉得要展示的是很复杂的东西&#xff0c;但并不是&#xff0c;这是一个很简单的部分&#xff0c;但也是一个很重要的部分&#xff0c;至少现在的我…

MATLAB-数组的使用

数组的使用&#xff08;持续更新&#xff09; randperm--数组随机排列permute--置换数组维度cat--串联数组squeeze--删除数组中长度为1的维度reshape--重构数组repmat--重复数组副本数组中的&#xff1a;sort-数组的排序dig-创建对角矩阵eig--特征值和特征向量magic--幻方矩阵m…

matlab定义数组和相关函数

matlab作为一个大型的计算软件&#xff0c;里面有许多对数组的操作&#xff0c;所以数组的定义和数组的操作是一个必不可少的部分。 1 数组的定义 在matlab中对数组的定义较为灵活&#xff0c;因为特殊矩阵较多&#xff0c;所以有许多特定的定义方法。比较常见的有三种&#…

Matlab的数组索引

在 MATLAB中&#xff0c;根据元素在数组中的位置&#xff08;索引&#xff09;访问数组元素的方法主要有三种&#xff1a;按位置索引、线性索引和逻辑索引。 按元素位置进行索引 最常见的方法是显式指定元素的索引。例如&#xff0c;要访问矩阵中的某个元素&#xff0c;请依序…

Matlab笔记-数组

一、结构数组的基本使用 结构体的定义即为C语言中结构体的初始化&#xff0c;其引用成员&#xff08;在Matlab中为field,字段的意思&#xff09;和C语言相同。 1、直接赋值 >> student(1).nameSilen; student(1).id1234; student(1).grade[1 2 3;4 5 6;7 8 9]; stude…

matlab三维数组

三维数组的定义&#xff1a;在MATLAB中&#xff0c;习惯性的将二维数组的第一维称为“行”&#xff0c;第二维称为“列”&#xff0c;而于三维数组&#xff0c;其第三维习惯性地称为“页”。 定义一个三维数组&#xff1a; A&#xff08;2&#xff0c;2&#xff0c;2&#xf…

MATLAB基础——关于数组(一)

变量和数组 MATLAB程序的基本数据单元是数组&#xff0c;标量在MATLAB中也被当做数组来处理 数组可以定义为向量&#xff08;一般描述为一维数组&#xff09;或矩阵&#xff08;一般描述为二维或多维&#xff09; 访问数组中的元素&#xff1a;数组名&#xff08;&#xff09;…

Matlab 数组与矩阵

矩阵 1、v21:3:18 ;表示的是从1 开始 18 结束&#xff0c;间隔为3 的一个等差数列v2 1 4 7 10 13 162、linspace(1,10,9);,介于1-10 之间&#xff0c;取9个数&#xff0c;使得他们是一个等差数列 >> linspace(1,10,9)ans 1.0000 2.1250 3.250…

matlab常用的数组操作总结

总结一下需要的matlab数组操作&#xff0c;免得每次都要去官网上找 参考文献&#xff1a;多维数组 - MATLAB & Simulink - MathWorks 中国: https://ww2.mathworks.cn/help/matlab/math/multidimensional-arrays.html#f1-87418 文章目录 1创建并扩展多维普通数组1普通数组引…

MATLAB怎么创建矩阵和数组

参考 MATLAB怎么创建矩阵和数组 - 云社区 - 腾讯云 第一步&#xff1a;首先教给大家如何创建数组&#xff0c;MATLAB创建数组的方法比较简单&#xff0c;我们在MATLAB中输入如下代码&#xff1a;x[2 4 6 8 10] 即可创建数组&#xff0c;数据之间使用空格或者逗号隔开&#xff…

MATLAB 数组计算

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

MATLAB-数组

数组 数组分类按照数组元素个数与排列方式分类按照数组的存储方式分类 创建数组直接输入函数生成 数组操作获取数组中的元素矩阵元素的引用单个元素的引用多个元素的引用&#xff1a;冒号的特殊用法 各类型数组操作数组的算术操作数组的逻辑运算使用库函数数组连接数组切片数组…

MATLAB中的数组

一、什么是数组 数组是组织成行和列的数据值的组合。 数组可以分为向量和矩阵。 向量通常用来描述只有一维的数组&#xff1b;而矩阵用来描述二维或者多维的数组。 数组在内存中存储是按列存储的。 二、创建和初始化一维或二维数组 1、在赋值语句中初始化 % array1为一维数…

MATLAB学习笔记——数组

MATLAB的数组 数组 数组的创建 &#xff08;1&#xff09;直接输入法 1、建立数组最直接的方法是在命令窗口直接输入数组 2、数组元素间用空格&#xff0c;逗号或分号分隔。 3、空格和逗号分隔建立行向量&#xff0c;元素之间用分号分隔建立列向量。 调用格式&#xff1…

Matlab中的向量和数组(超详细)

Matlab中的向量和数组&#xff08;超详细&#xff09; 文章目录 Matlab中的向量和数组&#xff08;超详细&#xff09;Matlab中的向量介绍创建向量向量的大小索引向量数值索引逻辑索引 缩短向量向量运算算术运算逻辑运算sum()、min()、max()、round()、ceil()、floor()、fix()切…