一、Lambda 表达式是什么?
Lambda 表达式是 Java SE 8 中一个重要的新特性。Lambda 表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体。Lambda表达式还增强了集合库,添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。
Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。
Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。
二、Lambda 用法
2.1 Lambda 语法
Lambda表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为两个部分:
- 左侧:指定了 Lambda 表达式需要的所有参数
- 右侧:指定了 Lambda 体,即 Lambda 表达式要执行的功能
(1)无参,无返回值,Lambda 体只需一条语句
Runnable r1 = () -> System.out.println("Hello Lambda!");
(2)Lambda 需要一个参数
Consumer<String> con = (x) -> System.out.println(x);
(3)Lambda 只需要一个参数时,参数的小括号可以省略
Consumer<String> con = x -> System.out.println(x);
(4)Lambda 需要两个参数,并且有返回值
Comparator<Integer> com = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
(5)当 Lambda 体只有一条语句时,return 与大括号可以省略
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
(6)Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
Comparator<Integer> com = (Integer x, Integer y) -> { //Integer 类型可以省略
System.out.println("函数式接口");
return Integer.compare(x, y);
};
//示例1:不需要接受参数,直接返回10
()->10
//示例2:接受两个int类型的参数,并返回这两个参数相加的和
(int x,int y)->x+y;
//示例2:接受x,y两个参数,该参数的类型由JVM根据上下文推断出来,并返回两个参数的和
(x,y)->x+y;
//示例3:接受一个字符串,并将该字符串打印到控制到,不反回结果
(String name)->System.out.println(name);
//示例4:接受一个推断类型的参数name,并将该字符串打印到控制台
name->System.out.println(name);
//示例5:接受两个String类型参数,并分别输出,不反回
(String name,String sex)->{System.out.println(name);System.out.println(sex)}
//示例6:接受一个参数x,并返回该该参数的两倍
x->2*x
2.2 替代匿名内部类
lambda表达式用得最多的场合就是替代匿名内部类,而实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类。
// 如果使用匿名内部类:
@Test
public void oldRunable() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("The old runable now is using!");
}
}).start();
}
// 使用lambda表达式:
@Test
public void runable() {
new Thread(() -> System.out.println("It's a lambda function!")).start();
}
2.3 对集合进行迭代
forEach()可以迭代集合中所有的对象,并且将lambda表达式带入其中。
// 普通的迭代
@Test
public void iterTest() {
List<String> languages = Arrays.asList("java","scala","python");
//before java8
for(String each:languages) {
System.out.println(each);
}
//after java8
languages.forEach(x -> System.out.println(x));
languages.forEach(System.out::println);
}
// 使用Lambda进行迭代
languages.forEach(System.out::println);
2.4 Lambda 表达式结合Stream对集合操作
具体用法下篇文章详细介绍!