一、Lambda表达式
1.1 Lambda表达式的一些基本概念
1.2 Lambda表达式的三个部分
// 简化前Comparator<Apple> byWeight=new Comparator<Apple>() {public int compare(Apple a1, Apple a2){return a1.getWeight().compareTo(a2.getWeight());}};//Lambda表达式Comparator<Apple> byWeight=(Apple a1, Apple a2)-> a1.getWeight().compareTo(a2.getWeight());
参数列表、箭头、Lambda主体
1.3 Lambda的基本语法
(parameters)-> expression
或(请注意语句的花括号)
(parameters)-> { statements; }
1.4 测试Lambda表达式
1.5 Lambda表达式的使用场景
Lambda表达式在函数式接口中使用。函数式接口就是只定义一个抽象方法的接口。
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个具体实现的实例)。
Lambdas及函数式接口的例子
1.5 类型推断
Java编译器会从上下文(目标类型)推断出用什么函数式接口来配合Lambda表达式,这意味着它也可以推断出适合Lambda的签名,因为函数描述符可以通过目标类型来得到。这样做的好处在于,编译器可以了解Lambda表达式的参数类型,这样就可以在Lambda语法中省去标注参数类型。换句话说,Java编译器会像下面这样推断Lambda的参数类型:
Java编译器会通过泛型<>来推断数据类型,所以可以省略
1.6 使用局部变量
Lambda表达式同样也可以使用局部变量,但是使用存在一些限制
- 局部变量必须显式声明为final,或事实上是final。
- 换句话说,Lambda表达式只能捕获指派给它们的局部变量一次
例如,下面的代码无法编译,因为portNumber变量被赋值两次: