你可以不知道怎么编写带有lambda表达式的代码,但是你必须能看明白它到底是什么东西,因为目前流行后端框架中都有它的身影。
如果需要使用到lambda表达式,那么必须要了解函数式接口。
什么是函数式(Functional)接口:一个接口有且仅有一个抽象方法,那么,这个接口,我们把它叫做函数式接口。
举例:
(o1,o2) -> Integer.compare(o1,o2);
左边( (o1,o2) ):lambda形参列表 (其实就是接口中的抽象方法的形参列表)。
右边( Integer.compare(o1,o2); ):lambda体 (其实就是重写抽象方法的方法体)。
Lambda使用(六种情况):
//第一种 无参数,无返回值
@Test
public void lambda01() {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("新建一个初始化线程");
}
};
r1.run();
System.out.println("*********************************");
//使用lambda表达式之后
Runnable r2 = () -> System.out.println("新建一个初始化线程");
r2.run();
}
//第二种 有参数,无返回值
@Test
public void lambda02() {
Consumer c1 = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println("使用消费者" + integer);
}
};
c1.accept(1);
System.out.println("*********************************");
//使用lambda表达式之后
Consumer<Integer> c2 = (Integer integer) -> System.out.println("使用消费者" + integer);
c2.accept(2);
}
//第三种 数据类型可以省略,因为可以有编译器推断得出,称为”类型推断“
@Test
public void lambda03() {
Consumer<Integer> c1 = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println("使用消费者" + integer);
}
};
c1.accept(1);
System.out.println("*********************************");
//使用lambda表达式之后
Consumer<Integer> c2 = (integer) -> System.out.println("使用消费者" + integer);
c2.accept(2);
}
//第四种情况 如果参数只要一个的情况下,可以省略参数列表的小括号
@Test
public void lambda04() {
Consumer<Integer> c1 = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println("使用消费者" + integer);
}
};
c1.accept(1);
System.out.println("*********************************");
//使用lambda表达式之后
Consumer<Integer> c2 = integer -> System.out.println("使用消费者" + integer);
c2.accept(2);
}
//第五种情况 需要两个或者以上参数,多条执行语句,并且有返回值
@Test
public void lambda05() {
Comparator<Integer> c1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
System.out.println(c1.compare(11,22));
System.out.println("*********************************");
//使用lambda表达式之后
Comparator<Integer> c2 = (o1, o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(c2.compare(11,22));
}
//第六种情况 当lambda体只有一条语句是,return和方法体的大括号都可以省略
@Test
public void lambda06() {
Comparator<Integer> c1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
};
System.out.println(c1.compare(11,22));
System.out.println("*********************************");
//使用lambda表达式之后
Comparator<Integer> c2 = (o1, o2) -> o1.compareTo(o2);
System.out.println(c2.compare(11,22));
}
总结:
--> 左边: lambda形参列表的参数类型都可以省略(类型推断);如果lambda形参列表只有一个,()可以省略。
--> 右边:lambda体应该使用{}包裹,如果lambda方法体如果只有一条语句,可以省略return和大括号(注意:要省略必须同时省略。)