1、Lambda表达式时Java 8新增的特性。Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码创建只有一个抽象方法的接口(即函数式接口)的实例。

2、当使用Lambda表达式代替匿名内部类创建对象时,Lambda表达式的代码块会代替实现抽象方法的方法体,Lambda表达式就相当于一个匿名方法。Lambda表达式由3部分组成:

1》形参列表:形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。

2》箭头(->):必须通过英文中画线和大于号组成。

3》代码块:如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。

3、Lambda表达式与函数式接口

Lambda表达式的类型,也被称为“目标类型(target type)”,Lambda表达式的目标类型必须是函数式接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。

Java 8专门为函数式接口提供了@FunctionalInterface注解,该注解通常放在接口定义前面,该注解对程序功能没有任何作用,只是告诉编译器要更严格的检查该定义的接口是否满足函数式接口的要求,即只包含一个抽象方法,否则编译器报错。

//Runnable是Java本身提供的函数式接口
//Lambda表达式的结果被当成一个对象
//使用Lambda表达式赋值
Runnable rn=() -> { for(int i=0;i<100;i++){ System.out.println("这里是run()方法体.");
}
};

从上面的实现可知,Lambda表达式实现的是一个匿名方法。Lambda表达式的局限性:

1》Lambda表达式的目标类型必须是明确的函数式接口

2》Lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为一个抽象方法的接口(函数式)接口创建对象。

如果上面的代码赋值给Object类型,由于Object类不是明确的函数式接口,编译过程会报错“不是函数接口”。

4、方法引用和构造器引用

前面已经提到,如果Lambda表达式的代码块只有一条语句,可以省略花括弧,其实还可以在代码中使用方法引用和构造器引用。方法引用和构造器引用可以让Lambda表达式的代码块更加简洁。方法引用和构造器引用都需要使用两个英文冒号(::)。

Lambda表达式支持的方法引用和构造器引用

种类 示例 说明 对应的Lambda表达式
引用类方法 类名::类方法 函数式接口中被实现的全部参数传递给该类方法作为参数 (a,b,...)->类名.类方法(a,b,...)
引用特定对象的实例方法 特定对象::实例方法 函数式接口中被实现方法的全部参数传给该方法作为参数 (a,b,...)->特定对象.实例方法(a,b,...)
引用某类对象的实例方法 类名::实例方法 函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数 (a,b,...)->a.实例方法(b,...)
引用构造器 类名::new 函数式接口中被实现方法的全部参数传递给该构造器作为参数 (a,b,...)->new 类名(a,b,...)

1》引用类方法:

@FunctionalInterface
public interface Converter{
Integer convert(String from);
}
...
//创建一个匿名对象
Converter converter1= from -> Integer.valueOf(from);
Integer val=converterl.convert("99");
System.out.println(val); ------------------------
Converter converter1= Integer::valueOf;

2》引用特定对象的实例方法

@FunctionalInterface
public interface Converter{
Integer convert(String from);
}
...
//创建一个匿名对象
Converter converter1= from -> "hello".indexOf(from);
Integer val=converterl.convert("ll");
System.out.println(val); ------------------------
Converter converter1= "hello"::indexOf;

最新文章

  1. DevExpress 隐藏Ribbon中barbuttonItem的SuperTip(1)
  2. jquery选择器案例
  3. EL表达式查询出来的数据,下载成excel表格,很实用的
  4. Lab_2_SysOps_VPC_Linux_v2.5
  5. Android模拟器配置选项说明
  6. PageLayoutControl的基本操作
  7. Windows10搭建PHP7开发环境
  8. java内存模型及分块
  9. 读书笔记之 - javascript 设计模式 - 责任链模式
  10. Visual Studio 2013 新增web项目IIS Express的64位版   转载来源http://www.cnblogs.com/jianyus/p/3524335.html
  11. c#用winform开发一个简易双色球项目
  12. composer windows下安装
  13. Docker虚拟机实战
  14. 洛谷P4592 [TJOI2018]异或(可持久化01Trie)
  15. UVAlive 6697 Homework Evaluation
  16. ESD总结
  17. 数学模型:3.非监督学习--聚类分析 和K-means聚类
  18. gitlab与jira集成
  19. Nodejs----单点登录
  20. &quot;软件&quot;和&quot;软件工程&quot;一词最早被谁提出?

热门文章

  1. 16 | “order by”是怎么工作的? 学习记录
  2. GUI学习之十二——QTextEdit学习总结
  3. memcpy函数的用法以及实现一个memcpy函数
  4. java 模拟表单方式提交上传文件
  5. 面向对象原生js轮播图
  6. os模块 sys模块 json/pickle 模块 logging模块
  7. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).
  8. mysql RIGHT JOIN关键字 语法
  9. mysql INNER JOIN关键字 语法
  10. mysql IN操作符 语法