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、方法引用和构造器引用
原文地址:https://www.cnblogs.com/ZeroMZ/p/11378686.html