Lambda表达式
Java8之后出来的新功能
是一个匿名函数,目的为了使代码更简洁.可以把它理解为一种传递的代码;
在学习Lambda表达式之前,我们先认识一个新的操作符: -> (可以称作箭头操作符)
以箭头操作符为分割: 代码整体可以看做
左侧: Lambda表达式参数列表
右侧:Lambda表达式中所需要执行的代码;即 Lambda体
可用于场景: 有一个接口,然后写匿名内部类来实现接口,再使用Lambda表达式来简化;
但是需要条件支持: 接口需要函数接口@FunctionInterface的支持(即 此接口只能有一个方法,如果有多个方法,Java中Lambda表达式不知道去找哪个方法,避免混淆);
//第一种:无参,无返回值Lambda表达式展示效果
public class TestLambda {
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类实现效果");
}
};
r.run();
System.out.println("---------------------");
Runnable r2 = ()->System.out.println("Lambda表达式实现效果");//用于接口方法是无参的,所以->左侧的参数列表只需要写一个小括号即可;右侧就是方法体;
r2.run();
}
}
//输出效果
匿名内部类实现效果
---------------------
Lambda表达式实现效果
//第二种:一个参数,无返回值Lambda表达式;
public class Test2 {
public static void main(String[] args) {
Consumer<String> con = new Consumer<String>() {
public void accept(String t) {
System.out.println(t+"实现效果");
}
};
con.accept("匿名内部类");
System.out.println("---------------------------");
Consumer<String> con2 = x -> System.out.println(x+"实现效果");//用于方法需要一个参数,所以箭头左侧给一个参数名即可,名字可自定义,并且若只有一个参数的话,小括号可以省略不写
con2.accept("Lambda表达式");
}
}
//第三种:有两个以上的参数,有返回值,并且Lambda体中有多条语句;
public class Test3 {
public static void main(String[] args) {
Comparator<Integer> c = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println("匿名内部类实现");
return Integer.compare(o1, o2);
}
};
Comparator<Integer> c2 = (x,y)->{//箭头左侧参数列表可以不指定参数类型,因为JVM可以推断出数据类型,如果要写必须每个参数都要写上参数类型;箭头右侧方法体有多条语句时大括号和return不可省略
System.out.println("Lambda表达式");
return Integer.compare(x, y);
};
}
}
//补充:数据推断;
//例如:
List<String> list = new ArrayList<>();//这里后面的<>里面没有指定泛型但是也不会报错就是JVM的数据推断;
//第四种:若Lambda表达式方法体中只有一条语句,那么return和大括号都可以省略
Comparator<Integer> c2 = (x,y)->Integer.compare(x, y);//同上一个例子,但是方法体中只有一条语句
总结:主要以->两侧看做两个部分
左侧部分:
1:参数类型可以不写,JVM会自动推断;
2.参数只有一个的时候,小括号可以省略;
3.参数名字可以自定义
右侧部分:
1.当方法体中只有一句代码时,大括号可以省略;
2.当方法体中只有一句代码,并且有返回值时,return和大括号都可以省略;