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#等都已经支 ...
随机推荐
- svn安装步骤
我使用的是myeclipse 8.5 svn是site-1.8.22.zip 步骤 1.在myeclipse安装路径下dropins文件夹中创建svn文件夹 2.解压site-1.8.22.zip复 ...
- Selenium爬虫实践(踩坑记录)之ajax请求抓包、浏览器退出
上一篇: 使用Selenium截取网页上的图片 前言 最近在搞公司内部系统,累的一批,需要从另一个内部系统导出数据存到数据库做分析,有大量的数据采集工作,又没办法去直接拿到那个系统的接口,太难了,只能 ...
- cloudera manager server迁移
一.迁移背景 服务器出了问题,导致整个cm server界面呈现出不可用的状态,也就是获取不到各个大数据组件以及主机相关的状态的信息,整个cm server的前端界面处于瘫痪的状态,不可用,刚开始怀疑 ...
- 一文入门Linux下gdb调试(二)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...
- Inceptor查询语句
-- MySQL中的语句都能用,不再一一描述,只记录一些不同 详情见Inceptor 6.0文档 3.4.4查询语句这节 -- 查询语句 SELECT开头,可以通过添加多种从句从Inceptor中的表 ...
- Eclipse配置MySQL连接工具
1.项目名称右键新建文件夹lib 2.用鼠标将mysql-connector-java-5.1.15-bin.jar移动到lib文件夹中 3.选择Copy files点击OK 4.右键移动过来的mys ...
- k倍区间(解题报告)前缀和简单应用
测评地址 问题 1882: [蓝桥杯][2017年第八届真题]k倍区间 时间限制: 1Sec 内存限制: 128MB 提交: 351 解决: 78 题目描述 给定一个长度为N的数列,A1, A2, . ...
- Codeforces #624 div3 C
You want to perform the combo on your opponent in one popular fighting game. The combo is the string ...
- pillow KeyError: 'WEBP'
描述 使用pillow库jpg转到webp报错 File "F:\Anaconda\lib\site-packages\PIL\Image.py", line 1983, in s ...
- Ubuntu下跑通py-faster-rcnn、详解demo运作流程
在不同的服务器不同的机器上做过很多次实验,分别遇到各种不一样的错误并且跑通Py-Faster-RCNN,因此,在这里做一个流程的汇总: 一.下载文件: 首先,文件的下载可以有两种途径: 1.需要在官网 ...