如果需要使用到lambda表达式,那么必须要了解函数式接口。
什么是函数式(Functional)接口:一个接口有且仅有一个抽象方法,那么,这个接口,我们把它叫做函数式接口。
举例:
(o1,o2) -> Integer.compare(o1,o2);
左边( (o1,o2) ):lambda形参列表 (其实就是接口中的抽象方法的形参列表)。
右边( Integer.compare(o1,o2); ):lambda体 (其实就是重写抽象方法的方法体)。
//第一种 无参数,无返回值
@Test
publicvoidlambda01(){
Runnable r1 =newRunnable() {
@Override
publicvoidrun(){
System.out.println("新建一个初始化线程");
}
};
r1.run();
System.out.println("*********************************");
//使用lambda表达式之后
Runnable r2 = () -> System.out.println("新建一个初始化线程");
r2.run();
}
//第二种 有参数,无返回值
@Test
publicvoidlambda02(){
Consumer c1 =newConsumer() {
@Override
publicvoidaccept(Integer integer){
System.out.println("使用消费者"+ integer);
}
};
c1.accept(1);
System.out.println("*********************************");
//使用lambda表达式之后
Consumer c2 = (Integer integer) -> System.out.println("使用消费者"+ integer);
c2.accept(2);
}
//第三种 数据类型可以省略,因为可以有编译器推断得出,称为”类型推断“
@Test
publicvoidlambda03(){
Consumer c1 =newConsumer() {
@Override
publicvoidaccept(Integer integer){
System.out.println("使用消费者"+ integer);
}
};
c1.accept(1);
System.out.println("*********************************");
//使用lambda表达式之后
Consumer c2 = (integer) -> System.out.println("使用消费者"+ integer);
c2.accept(2);
}
//第四种情况 如果参数只要一个的情况下,可以省略参数列表的小括号
@Test
publicvoidlambda04(){
Consumer c1 =newConsumer() {
@Override
publicvoidaccept(Integer integer){
System.out.println("使用消费者"+ integer);
}
};
c1.accept(1);
System.out.println("*********************************");
//使用lambda表达式之后
Consumer c2 = integer -> System.out.println("使用消费者"+ integer);
c2.accept(2);
}
//第五种情况 需要两个或者以上参数,多条执行语句,并且有返回值
@Test
publicvoidlambda05(){
Comparator c1 =newComparator() {
@Override
publicintcompare(Integer o1, Integer o2){
System.out.println(o1);
System.out.println(o2);
returno1.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);
returno1.compareTo(o2);
};
System.out.println(c2.compare(11,22));
}
//第六种情况 当lambda体只有一条语句是,return和方法体的大括号都可以省略
@Test
publicvoidlambda06(){
Comparator c1 =newComparator() {
@Override
publicintcompare(Integer o1, Integer o2){
returno1.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和大括号(注意:要省略必须同时省略。)