什么是Lambda表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 是一个匿名函数,可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java的语言表达能力得到了提升。
lambda 表达式的语法格式如下:
(parameters) -> expression
或者
(parameters) ->{ statements; }
以下是lambda表达式的重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
Lambda 表达式的简单例子:
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
Lambda表达式语法
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
Runnable runnable = () -> System.out.println("Lambda表达式");
Lambda 表达式在Java 语言中引入了一个新的语法元 素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为 两个部分:
左侧:指定了 Lambda 表达式需要的所有参数
右侧:指定了 Lambda 体,即 Lambda 表达式要执行的功能。
lambda表达式语法可抽象表示为:
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
...
return statmentN;
}
以Predicate判断是否为成年人为例:
Predicate<Person> predicate = (Person person) -> {
Integer age = person.getAge();
return age >= 18;
};
上面的lambda表达式语法抽象表示是比较官方的,和我们平时所写的lambda表达式比起来要繁琐一些。别着急,下面会一点一点地演示lambda表达式的简化过程。
- 参数类型省略
绝大多数情况,编译器都可以从上下文环境中推断出lambda表达式的参数类型。这样,lambda表达式就变成了:
(param1, param2, ..., paramN) -> {
statment1;
statment2;
...
return statmentN;
}
上面的例子也可简化为:
Predicate<Person> predicate = (person) -> {
Integer age = person.getAge();
return age >= 18;
};
- 当lambda表达式的参数个数只有一个,可以省略小括号。
lambda表达式简写为:
param -> {
statment1;
statment2;
...
return statmentN;
}
对应的例子简化为:
Predicate<Person> predicate = person -> {
Integer age = person.getAge();
return age >= 18;
};
-
当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。
其他省就省了,为啥return关键字也可以被省略呢?原因是,编译器会认为:既然只有一个语句,那么这个语句执行的结果就应该是返回值,所以return也就不需要了。因此,lambda表达式简化为:
param -> statment;
所以例子又可简化成:
Predicate<Person> predicate = person -> person.getAge() >= 18