Java8新特性之Lambda表达式
一、为什么使用Lambda 表达式
Lambda 是一个匿名函数, 我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递) 。 可以写出更简洁、 更灵活的代码。 作为一种更紧凑的代码风格, 使Java的语言表达能力得到了提升。
二、Lambda 表达式
2.1、从匿名类到 Lambda 的转换
1、举例1-多线程:
(1)不使用Lambda时实现方式
// 匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello World!!!");
}
};
(2)使用Lambda时实现方式
// Lambda表达式
Runnable runnable = () -> System.out.println("Hello World!!!");
2、举例2-定制排序:
(1)不使用Lambda时实现方式
// 原来使用匿名内部类作为参数传递
TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Integer.compare(o1.length(), o2.length());
}
});
(2)使用Lambda时实现方式
// Lambda表达式直接作为参数传递
TreeSet<String> treeSet = new TreeSet<>((o1, o2) -> Integer.compare(o1.length(), o2.length()));
2.2、Lambda 表达式语法
Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。 这个操作符为->
, 该操作符被称为 Lambda 操作符或箭头操作符,它将 Lambda 分为两个部分:
- 左侧:指定了 Lambda 表达式需要的所有参数
- 右侧:指定了 Lambda 体, 即 Lambda 表达式要执行的功能
1、语法格式一
Lambda表达式无参数, 无返回值, Lambda体只有一条执行语句。
Runnable runnable = () -> System.out.println("Hello World!!!");
2、语法格式二
Lambda表达式有一个参数,无返回值,Lambda体只有一条语句。
Consumer<String> consumer = (String param) -> System.out.println(param);
3、语法格式三
Lambda表达式参数的数据类型可以省略, 因为可由编译器推断得出,称为“类型推断” ,”语法格式二“参数去掉类型后简写如下。
Consumer<String> consumer = (param) -> System.out.println(param);
4、语法格式四
Lambda表达式只有一个参数时,参数的小括号可以省略,该格式属于“语法格式三”的进一步简写形式。
Consumer<String> consumer = param -> System.out.println(param);
5、语法格式五
Lambda表达式有多个参数,有返回值,并且 Lambda 体中有多条语句。
BinaryOperator<Long> binaryOperator = (x, y) -> {
System.out.println("实现函数式接口方法!");
return x + y;
};
6、语法格式六
当 Lambda 体只有一条语句时, return 与大括号可以省略。
BinaryOperator<Long> binaryOperator = (x, y) -> x + y;
三、类型推断
上述”语法格式三“之后的Lambda 表达式中的参数都省略了参数类型,这是因为其参数类型都是可以由编译器推断得出的。Lambda 表达式中无需指定类型, 程序依然可以编译, 这是因为 javac 根据程序的上下文, 在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境, 是由编译器推断出来的,这就是所谓的 “类型推断” 。
- 点赞
- 收藏
- 关注作者
评论(0)