1.Lambda表达式
Lambda表达式是Java 8引入的新特性,详细JSR规范见:JSR-337(9.8 Functional Interfaces/15.13 Method Reference Expressions/15.27 Lambda Expressions)
1.1 Lambda表达式结构:
(参数列表)->{代码块}
- 形参列表:a.参数列表可以为空
- b.如果只要一个参数可以省略括号
- 代码块:a.如果代码块只有一条语句,可以省略花括号
- b.如果代码块有返回值且只有一条语句,可以省略return关键词,返回这一条语句的值作为返回值!
2.函数式接口
2.1 定义:只声明一个抽象方法的接口(可以存在多个类方法和默认方法)
2.2 lambda表达式与函数式接口:
lambda表达式的使用依赖与函数式接口,lambda表达式需要赋值给一个函数式接口,并通过函数式接口中的唯一抽象方法调用(抽象方法的入参、返回值必须与lambda表达式一致)!
2.3 @FunctionalInterface注解:
Java 8为函数式接口提供了专门的注解,该注解没有任何功能作用,仅仅是告知编译器该接口为函数式接口,不满足函数式接口要求编译报错!
代码示例(包含与内部匿名类的比较):
@FunctionalInterface
interface TestFunction{
int apply(int a);
}
public class Main {
public static void main(String args[]) {
/*Lambda表达式实现*/
TestFunction testCase1 = (int q) -> {
System.out.println("Lambda Test");
return q;
};
System.out.println(testCase1.apply(100));
/*匿名类对比实现*/
TestFunction testCase2 = new TestFunction()
{
public int apply(int a)
{
System.out.println("Lambda Test");
return a;
}
};
System.out.println(testCase2.apply(100));
}
}
3.方法引用与构造器引用
当lambda表达式代码块中只有一条语句的时候,可以使用方法引用和构造器引用来进一步简化,但是个人感觉可能这种写法相对比较晦涩(这里面就不具体提供代码示例了),详细说明见JSR-337-15.13!
4.Lambda表达式与匿名内部类关系
相同点:
- Lambda表达式是匿名内部类的一种简化,可以替代部分匿名内部类
- Lambda表达式与匿名内部类一样,都遵循"effectively final"规则
不同点:
Lambda表达式的使用场景,仅仅是生成一个函数式接口实现类的过程;但是匿名内部类的使用场景,是继承父类(基础类、抽象类、接口),并生成一个匿名子类的过程!所以匿名内部类的使用场景更多,类内可以实现多个抽象方法,并可以直接访问接口中的默认方法!Lambda表达式仅仅是匿名内部类的一个使用场景!