为什么要使用Lambda表达式?
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
使用Lambda表达式的前后对比:
举例一:
@Test
public void test(){
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 test2(){
Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int compare1 = com1.compare(12,21);
System.out.println(compare1);
System.out.println("******************************");
//Lambda表达式的写法
Comparator<Integer> com2 =(o1,o2) -> Integer.compare(o1,o2);
int compare2 = com2.compare(40,21);
System.out.println(compare2);
System.out.println("******************************");
//方法引用的写法
Comparator<Integer> com3 = Integer :: compare;
int compare3 = com3.compare(40,21);
System.out.println(compare3);
}
Lambda表达式的基本语法:
说明:
Lambda 表达式:在Java 8 中引入的一种新的语法元素和操作符。这个操作符为 “->” ,该操作符被称为 Lambda 操作符 或箭头操作符。
它将 Lambda 分为两个部分:
左侧:指定了 Lambda 表达式需要的参数列表。
右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即 Lambda 表达式要执行的功能。 1.以 (o1,o2) -> Integer.compare(o1,o2)举例说明。
2.格式:
->:Lambda操作符或者箭头操作符。
->的左边:Lambda的形参列表(其实就是接口中的抽象方法的形参列表)。
->的右边:Lambda体(其实就是重写的抽象方法的方法体)。
Lambda表达式语法的六种格式:
语法格式一:无参,无返回值。
语法格式二:Lambda 需要一个参数,但是没有返回值。
语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”。
语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略。
语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值。
语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略。
语法格式一代码举例:
//语法格式一:无参,无返回值
@Test
public void test1(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("我是一个好人");
}
};
r1.run();
System.out.println("*********************改写为Lambda表达式后为*********************");
Runnable r2 = () -> {
System.out.println("我真是一个大好人");
};
r2.run();
}
语法格式二代码举例:
//语法格式二:Lambda 需要一个参数,但是没有返回值。
@Test
public void test2(){
Consumer<String> con = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
con.accept("我是个好人222");
System.out.println("***************改写为Lambda表达式后为**********************");
Consumer<String> con1 = (String s) ->{
System.out.println(s);
};
con1.accept("我真是一个大好人222");
}
语法格式三代码举例:
//语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
@Test
public void test3(){
Consumer<String> con1 = (String s) ->{
System.out.println(s);
};
con1.accept("我是个好人333");
System.out.println("**************************");
Consumer<String> con2 = (s) ->{
System.out.println(s);
};
con2.accept("我真是一个大好人333");
ArrayList<String> list = new ArrayList<>(); //这个也是类型推断
int[] arr = {1,2,3,4,5}; //这也是类型推断
}
语法格式四代码举例:
//语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略
@Test
public void test4(){
Consumer<String> con1 = (s) ->{
System.out.println(s);
};
con1.accept("我是一个好人444");
System.out.println("**************************");
Consumer<String> con2 = s ->{
System.out.println(s);
};
con2.accept("我真是一个大好人444");
}
语法格式五代码举例:
//语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
@Test
public void test5(){
Comparator<Integer> com1 = 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(com1.compare(16,20));
System.out.println("*********************************");
Comparator<Integer> com2 = (o1,o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
System.out.println(com2.compare(16,6));
}
语法格式六代码举例:
//语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略
@Test
public void test6(){
Comparator<Integer> com1 = (o1,o2) -> {
return o1.compareTo(o2);
};
System.out.println(com1.compare(16,6));
System.out.println("*******************************");
Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);
System.out.println(com2.compare(16,26));
//另一种表现形式
Consumer<String> con1 = (s) ->{
System.out.println(s);
};
con1.accept("我是一个好人666");
System.out.println("*********************************");
Consumer<String> con2 = (s) -> System.out.println(s);
con2.accept("我真是一个大好人666");
}
总结:
->的左边:Lambda形参列表的参数类型可以省略(类型推断),如果Lambda形参列表只有一个参数,其一对()也可以省略。
->的右边:正常情况下,Lambda体应该使用一对{}包裹,如果Lambda体只有一条执行语句(也可能是return语句),可以省略这一对{}同时省略return关键字。
补充:
Lambda表达式的本质:作为函数式接口的实例(接口的具体实现类的对象)