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#等都已经支 ...
随机推荐
- sql,关键字使用
select instr('dds万','万',1) from dual --判断万关键字是否存在 select to_single_byte('9') from dual --全角数字转为半角数字 ...
- linux-Navicat连接linux远程数据
linux-Navicat连接linux远程数据 (一)登陆数据库 (二)创建用户用于远程连接 GRANT ALL PRIVILEGES ON *.* TO '账号'@'%' IDENTIFIED B ...
- Kwp2000协议的应用(程序原理篇)
作者:良知犹存 转载授权以及围观:欢迎添加微信:becom_me 总述 接上篇文章Kwp2000协议的应用(硬件原理使用篇),本篇针对kwp2000协议标准的服务ID详细介绍,以及针对程序实现 ...
- python+selenium+bs4爬取百度文库内文字 && selenium 元素可以定位到,但是无法点击问题 && pycharm多行缩进、左移
先说一下可能用到的一些python知识 一.python中使用的是unicode编码, 而日常文本使用各类编码如:gbk utf-8 等等所以使用python进行文字读写操作时候经常会出现各种错误, ...
- zjnu1189 土地租用(完整版)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 77 Accepted: 10 Description 随着YYHS的OI ...
- codeforces Looksery Cup 2015 C. The Game Of Parity
There are n cities in Westeros. The i-th city is inhabited by ai people. Daenerys and Stannis play t ...
- 牛客编程巅峰赛S1第3场 - 青铜&白银 C.牛牛晾衣服(二分)
题意:有\(n\)件衣服,每件衣服都有\(a_{i}\)滴水,所有衣服每分钟都能自然烘干\(1\)滴水,或者用烘干机,每分钟可以烘干\(k\)滴水,问最快多少分钟可以使所有衣服都烘干. 题解:这题和之 ...
- Leetcode(712)-账户合并
给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该帐户的邮箱地址 ...
- MATLAB中将mat文件转为txt格式文件
直接保存为txt文件: 可以用fprintf函数,来代替save函数 比如现在我有一个变量a=[0.1223 345.4544] 如果我想保存它的话,可以用下面的程序: fid = fopen(' ...
- java之 javassist简单使用
0x01.javassist介绍 什么是javassist,这个词一听起来感觉就很懵,对吧~ public void DynGenerateClass() { ClassPool pool = Cla ...