Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。它是 Java 8 中最重要新特性。
Java 中的 Lambda 表达式通常使用 (arguments) -> (expression) 语法书写。以下是lambda表达式的重要特征:
- 可选参数:Lambda 表达式可以有零个或多个参数。
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
以下是一些 Lambda 表达式的例子:
// 无argument,直接return值
() -> "Andy"
// 接收一个argurment, return一个计算值
x -> 2 * x
// 接收2个arguments, return一个计算值
(int x, int y) -> { return x – y; }
// 接受一个string, 并println, 不return任何值
(String s) -> { System.out.println(s); }
Lambda 表达式举例
// 旧方法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello from thread");
}
}).start();
// Lambda方法:
new Thread( () -> System.out.println("Hello from thread") ).start();
以下代码的作用是打印出给定数组中的所有元素。注意,使用 Lambda 的方法不止一种。在下面的例子中,我们先是用常用的箭头语法创建 Lambda,之后,使用 Java 8 全新的双冒号(::)操作符将一个常规方法转化为 Lambda:
// 旧方法:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for(Integer n: list) {
System.out.println(n);
}
// Lambda方法:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n));
// ::操作
list.forEach(System.out::println);
变量作用域
Lambda 只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
Top comments (0)