Java自学第9期——Lambda表达式
1、入门
使用场景:如果创建函数式接口(该接口的抽象方法只能有一个)的实例时,使用Lambda表达式更加简洁方便。
2、格式:
(形参列表) -> { 代码块 }
3、简化
只有一个参数时,可以省略圆括号();
代码块只有一条语句,可以省略花括号{};
代码块里只有一个语句时,即是需要return,也可以省略return关键字(仅仅是关键字),
需要返回值时自动返回这条省略了return的语句的值。
4、限制:
1、Lambda表达式的类型必须是函数式接口(不是的话可以强制类型转换,但与目标类型的唯一抽象方法要有相同的形参列表);
2、Lambda表达式只能为函数式接口创建对象;
函数式接口典型例子:
XxxFunction\XxxConsumer\Predicate\XxxSupplier
3、java8为函数式接口提供了@FunctionalInterface注解,放在接口定义前面,告诉编译器对该接口进行检查是否为函数式接口。
public class Demo01 {
//创建Runnable对象,Runnable是一个函数式接口
public static void main(String[] args) {
Runnable r = ()-> System.out.println("Runnable");
Runnable r1 = () -> {
for (int i = 0; i < 2; i++) {
System.out.println(i);
}
};
5、补充
方法引用和构造器引用简化写法
条件:如果代码块只有一条语句时,还可以进一步简化lambda写法。
1.引用类方法
格式: 类名::方法
说明: 接口中被实现方法的全部参数 传给该类方法作参数。
2.引用特定对象的实例方法
格式: 特定对象::实例方法
说明: 接口中被实现方法的全部参数 传给该类方法作参数。
3.引用某类对象的实例方法
格式: 类名::实例方法
说明: 接口中被实现方法的第一个参数作为调用者,剩余参数作为该方法的参数
4.引用构造器
格式: 类名::new
说明: 接口中被实现方法的全部参数 传给该构造器作参数。
//定义一个函数式接口
@FunctionalInterface
interface Demo02 {
//只有一个抽象方法convert()
Integer convert(String from);
}
@FunctionalInterface
interface Demo021{
String test(String a,int b,int c);
}
@FunctionalInterface
interface Demo022{
JFrame win(String title);
}
class Demo03{
public static void main(String[] args) {
//调用Integer类的valueOf方法
Demo02 obj1 = Integer::valueOf;
//调用"99"对象的indexOf()实例方法实现
Demo02 obj2 = "99"::indexOf;
//被实现方法的第一个参数作为调用者
//后面全部参数传给该方法作参数
Demo021 obj3 = String::substring;
//构造器引用
Demo022 obj4 = JFrame::new;
}
}
6、区别
lambda表达式与匿名内部类的区别:
lambda表达式是匿名内部类的一种简化,
相同点:
1、都可以直接访问effectively final局部变量以及外部类的成员变量(包括实例变量和类变量);
2、二者创建的对象都可以直接调用从接口中继承的默认方法。不同点:
1、匿名内部类可为任意接口创建实例,无论有多少抽象方法,lambda只能为函数式接口创建实例。
2、匿名内部类可以为抽象类或普通类创建实例,后者只能为函数式接口创建实例。
3、匿名内部类实现的抽象方法的方法体允许调用接口定义的默认方法,lambda表达式的代码块不允许调用接口定义的默认方法。
下期介绍File类和IO流。
Java自学第9期——Lambda表达式的更多相关文章
- Java 终于在 Java 8 中引入了 Lambda 表达式。也称之为闭包或者匿名函数。
本文首发于 blog.zhaochunqi.com 转载请注明 blog.zhaochunqi.com 根据JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭 ...
- Java :一文掌握 Lambda 表达式
本文将介绍 Java 8 新增的 Lambda 表达式,包括 Lambda 表达式的常见用法以及方法引用的用法,并对 Lambda 表达式的原理进行分析,最后对 Lambda 表达式的优缺点进行一个总 ...
- Java 8新特性-3 Lambda 表达式
在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差. 在Java 8 之前使用匿名内部类: 例如 interface ITestPrint{ public voi ...
- [Java] 设计模式:代码形状 - lambda表达式的一个应用
[Java] 设计模式:代码形状 - lambda表达式的一个应用 Code Shape 模式 这里介绍一个模式:Code Shape.没听过,不要紧,我刚刚才起的名字. 作用 在应用程序的开发中,我 ...
- Java 8 新特性之 Lambda表达式
Lambda的出现就是为了增强Java面向过程编程的深度和灵活性.今天就来分享一下在Java中经常使用到的几个示例,通过对比分析,效果应该会更好. – 1.实现Runnable线程案例 其存在的意义就 ...
- Effective Java 第三版——42.lambda表达式优于匿名类
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Java编程的逻辑 (91) - Lambda表达式
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- Java之线程池和Lambda表达式
线程池和lambda表达式 学习线程池和lambda表达式的理解 补充一个知识点(单例设计模式) 在多线程中,我们只需要一个任务类,为了防止创建多个任务类,这个时候就需要用到单例模式,单例模式有两种设 ...
- Java 常用的几个lambda表达式
Lambda表达式是Java 8一个非常重要的新特性.它像方法一样,利用很简单的语法来定义参数列表和方法体.目前Lambda表达式已经成为高级编程语言的标配,像Python,Swift,C#等都已经支 ...
随机推荐
- BigDecimal 用法详解
BigDecimal简介 BigDecimal用法: BigDecimal的构造方法 BigDecimal常用方法描述 BigDecimal比较 BigDecimal总结 BigDecimal简介 J ...
- Hbase 表的设计原则 ————总结
1.列族的数量及列族的势 建议将HBase列族的数量设置的越少越好.当强,对于两个或两个以上的列族HBase并不能处理的很好.这是由于HBase的Flushing和压缩是基于Region的.当一个列族 ...
- python--基础3(流程语句)
资源池 链接:https://pan.baidu.com/s/1OGq0GaVcAuYEk4F71v0RWw 提取码:h2sd 本章内容: if判断语句 for循环语句 while循环语句 break ...
- 让visual studio总是以管理员身份启动
环境 win10 visual studio 2019 步骤 找到visual studio的安装目录 怎么找? 右击win10开始菜单中visual studio的快捷方式, 依次选择 更多-> ...
- Codeforces Round #649 (Div. 2) A. XXXXX
题目链接:https://codeforces.com/contest/1364/problem/A 题意 找出大小为 $n$ 的数组 $a$ 的最长连续子数组,其元素和不被 $x$ 整除. 题解 如 ...
- lca讲解 && 例题 HDU - 4547
一. 最普通的找树中两个点x,y最近公共祖先: 在进行lca之前我们要先对这一颗树中的每一个点进行一个编号,像下图一样.这个编号就是tarjan算法中的dfn[]数组 这样的话我们可以在跑tarjan ...
- Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) A. Prison Break
题意:有一张\(n\)x\(m\)的图,图中每个点都关押着罪犯,在坐标\((r,c)\)处有一个出口,每名罪犯每秒可以可以像上下最有移动一个单位或者不动,问所有罪犯能够逃离监狱的最少时间. 题解:直接 ...
- Tomacat目录以及服务器配置文件信息
一. 1.Tomacat的启动: 在我的windows10中我下载的是8.5版本的tomacat,我就是通过".sh"文件来打开和关闭tomacat 要打开.sh文件还需要 这个G ...
- 在Blazor Server 项目中使用 EF Core Sqlite
按照教程创建了一个 Blazor Server 项目 教程地址: https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/build-a-blaz ...
- OpenStack Train版-12.创建虚拟网络并启动实例(控制节点)
使用VMware虚拟机创建网络可能会有不可预测到的故障,可以通过dashboard界面,管理员创建admin用户的网络环境 1.第一种: 建立公共提供商网络在admin管理员用户下创建 source ...