死磕Lambda表达式(一):初识Lambda
弱小和无知不是生存的障碍,傲慢才是。——《三体》
什么是Lambda表达式
Lambda表达式是表示可传递匿名函数的一种简洁方式,Lambda表达式没有名称,但是有参数列表、函数主体、返回类型,还可能有一个可以抛出的异常列表。它是Java8新增的特性,有了它我们再也不用像之前那样写一堆笨重的匿名类代码了,我们先来体验一下。
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
与匿名函数对比
下面我们先举个例子,有这样一个表示口罩的类:
package one.more.study;
/**
* 口罩
*/
public class Mask {
/**
* 品牌
*/
private String brand;
/**
* 类型
*/
private String type;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
再创建一个口罩列表,添加一些口罩对象:
List<Mask> maskList = new ArrayList<>();
maskList.add(new Mask("3M", "KN95"));
maskList.add(new Mask("3M", "FFP2"));
maskList.add(new Mask("Honeywell", "KN95"));
maskList.add(new Mask("Honeywell", "N95"));
现在我们按照品牌给这个口罩列表进行排序。在Java8之前,我们可以用匿名函数进行实现:
maskList.sort(new Comparator<Mask>() {
@Override
public int compare(Mask o1, Mask o2) {
return o1.getBrand().compareTo(o2.getBrand());
}
});
我们再使用Lambda表达式实现一下:
maskList.sort((Mask o1, Mask o2) -> o1.getBrand().compareTo(o2.getBrand()));
显而易见,使用Lambda表达式以后,代码看起来更清晰更简洁了。假如你还是一脸懵圈的话也没关系,这里我只是想显摆一下Lambda表达式很牛掰,接下来我会一点点地详细讲解清楚。
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
Lambda表达式的组成
Lambda表达式由三部分组成,以上面的口罩排序的例子为例,如下图:
- 参数列表:本例中是两个
Mask
对象的参数,采用的是Comparator接口中compare方法的参数。 - 箭头:
->
把参数列表和主体分隔为两个部分。 - 主体:本例中是把比较口罩品牌的表达式作为Lambda表达式的返回。主体可以修改成另外一种写法,含义是一样的:
maskList.sort((Mask o1, Mask o2) -> {
return o1.getBrand().compareTo(o2.getBrand());
});
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
Lambda表达式的基本语法
从上面的例子中的两个种写法中,可以看出Lambda表达式有两种基本语法,分别如下:
- (参数列表)
->
表达式 - (参数列表)
->
{ 多条语句 }
只看这两条干瘪的语法,理解起来比较困难,实践出真知,我们来多举几个例子。
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
Lambda表达式示例
- 我们提到的例子,Lambda表达式的参数列表有两个Mask类型的参数,主体是比较两个Mask对象的品牌,返回的是一个int类型。当主体是一个表达式时,不需要return语句,隐含return该表达式的返回值。
(Mask o1, Mask o2) -> o1.getBrand().compareTo(o2.getBrand())
- 参数列表中仅有一个Mask类型的参数,返回的是一个String类型,是该Mask对象的品牌信息。
(Mask mask) -> mask.getBrand()
- 参数列表中仅有一个Mask类型的参数,返回的是一个boolean类型,是该Mask对象的类型是否为N95。
(Mask mask) -> mask.getType() == "N95"
- 参数列表中没有任何参数,返回的是一个int类型。
() -> 996
- 参数列表中有两个int类型的参数,但是没有返回值(void)。在主体中可以写多条语句,不过记住要用
{
和}
将其包裹。
(int x, int y) -> {
System.out.println("万猫学社想对你说:");
System.out.println("第一个参数是:" + x);
System.out.println("第二个参数是:" + y);
System.out.println("两数之和是:" + (x + y));
}
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
小测试
看了这么多的例子,是不是撸胳膊挽袖子准备大干一场?别急,检验出真知,我们先简单测试一下。以下的Lambda表达式有哪几个是正确的?
() -> {}
() -> "万猫学社"
() -> { "万猫学社" }
() -> { return "万猫学社"; }
() -> return "万猫学社";
请思考片刻…
.
.
.
.
.
.
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
宣布答案:第1、2和4个是正确的,第3和5个是错误的。我们来逐个分析一下:
() -> {}
:正确,这个Lambda表达式没有参数,也没有任何返回。() -> "万猫学社"
:正确,这个Lambda表达式没有参数,主体是一个表达式,返回String类型。() -> { "万猫学社" }
:错误,"万猫学社"
是一个表达式,不是一个语句,不能使用{
和}
将其包裹,可以修改为() -> "万猫学社"
。() -> { return "万猫学社"; }
:正确,这个Lambda表达式没有参数,主体是一个语句,使用{
和}
将其包裹,返回String类型。() -> return "万猫学社";
:错误,return "万猫学社";
是一个语句,不是一个表达式,必须使用{
和}
将其包裹,可以修改为() -> { return "万猫学社"; }
。
如果你全部答对,恭喜你,你已经基本掌握Lambda表达式的基本语法;如果你有答错的,没关系,重新再看一遍,再复习巩固一下。
学习的路上,我与你一起前行。
《死磕Lambda表达式》系列
- 死磕Lambda表达式(一):初识Lambda
- 死磕Lambda表达式(二):Lambda的使用
- 死磕Lambda表达式(三):更简洁的Lambda
- 死磕Lambda表达式(四):常用的函数式接口
- 死磕Lambda表达式(五):Comparator复合
- 死磕Lambda表达式(六):Consumer、Predicate、Function复合
欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。
死磕Lambda表达式(一):初识Lambda的更多相关文章
- Qt5中的lambda表达式和使用lambda来写connect
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:
形参列表=>函数体 函数体多于一条语句的可用大括号括起. 类型 可以将此表达式分配给委托类型,如下所示: delegate int del(int i); del myDelegate = ...
- lambda表达式,及lambda简化过程
lambda表达式(jdk8特性) 1.为什么要用lambda表达式 原因:因为我们有时候需要用到很多类,但是,这些类我们只用一次或者两次,所以我们用匿名内部类,但是匿名内部类多了还是很麻烦,所以用l ...
- 委托、 Lambda表达式和事件——Lambda表达式
/* * 由SharpDevelop创建. * 用户: David Huang * 日期: 2015/7/30 * 时间: 16:32 */ using System; namespace Lambd ...
- .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式
开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,. ...
- Java基础教程(23)--lambda表达式
一.初识lambda表达式 1.定义 lambda表达式是一个可传递的代码块,或者更确切地说,可以把lambda表达式理解为简洁地表示可传递的匿名方法的一种方式.它没有名称,但它有参数列表.函数主 ...
- 委托和lambda表达式,Action和Func
1.为什么要用委托 我们为什么要有委托?任何东西存在即合理,不合理的也会被时间淘汰掉,委托既然存在肯定有存在的必要,我们来看一下什么时候可以用到委托. 接下来我们有个需求,就是调用一个方法,取出1-1 ...
- 委托,匿名函数和lambda表达式
很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一 ...
- lambda表达式之进化
前言 在C#我们可以自定义委托,但是C#为什么还要内置泛型委托呢?因为我们常常要使用委托,如果系统内置了一些你可能会用到的委托,那么就省去了定义委托,然后实例化委托的步骤,这样一来既使代码看起来简洁而 ...
随机推荐
- Linux下安装Ant
前言 Apache Ant 是一个构建工具,可以将软件编译.测试.部署等步骤联系在一起完成自动化工作,比如可以利用Ant来执行Jmeter的 jmx 脚本,生成了 jtl 测试结果文件,接着再利用An ...
- Excel.Application使用手册
Excel.Application组件使用方法,适合应用于使用EXCEL组件做WEB应用开发. 转自http://bbs.xtjc.com/thread-376095-1-1.html 定制模块行为( ...
- 团队项目-Beta冲刺2
博客介绍 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience 这个作业要求在哪里 https://w ...
- C# winform 弹框提示内存不足
看了下面一片博文解决的 Winform 内存不足Winform,我给PictureBox 赋值 picBox_One.BackgroundImage = Image.FromFile("图片 ...
- 19_07_08校内训练[grid]
题意 现有n*m的长方形网格,每个格子中写着一个数,并构成了[0,n*m)的排列.每次可以将一行循环平移x格,也可以将一列循环平移x格.给出初始状态,给出一个到达给定状态的方案.n*m<=100 ...
- Linux 查看磁盘IO并找出占用IO读写很高的进程
背景-线上告警 线上一台服务器告警,磁盘利用率 disk.util > 90,并持续告警. 登录该服务器后通过 iostat -x 1 10 查看了相关磁盘使用信息.相关截图如下: # 如果没有 ...
- Maven - 配置管理
Maven Maven是一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理.Project Object Model:项目对象模型.将Java工程的相关信息封装为对象形式作为便于操作和管理 ...
- C++基类和派生类的析构函数
1.派生类也不能继承基类的析构函数. 2.与构造函数不同的是,在派生类的析构函数中不用显式地调用基类的析构函数,因为每个类只有一个析构函数,编译器知道如何选择,无需程序员干涉. 3.构造函数和虚构函数 ...
- k3s首季在线培训来袭!本周四晚,线上见!
筹备已久的k3s在线培训终于要和大家见面啦! k3s是一款适用于边缘计算场景以及IoT场景的轻量级Kubernetes发行版,经过CNCF的一致性认证.由业界应用最广泛的Kubernetes管理平台R ...
- DHCP服务器配置及测试
1 DHCP服务器简介 DHCP(Dynamic Host Configuration Protocol),动态主机配置协议,DHCP 协议主要是用来自动为局域网中的客户机分配TCP/IP 信息的网络 ...