lambda表达式
1,引入lambada表达式
需求:把行为作为一个对象,并将它作为一个参数传递给另一个方法
- 声明一个变量,并给变量赋值
Function funtion = public static void hello(){
System.out.println("hello world");
}
- 简化表达式
//public是声明调用范围的,可去掉
//static是来指明属于类的,还是对象的,可去掉
Function function = void hello(){
System.out.println("hello world");
}
//该方法已赋值给了变量,因此方法名可去掉
Function function = ()->{System.out.println("hello world");};
- 声明接口
public class Demo {
public static void main(String[]args){
Function function = ()->{System.out.println("hello world");} ;
function.foo();
}
}
interface Function{
void foo();
}
2,lambda表达式的本质
lambda表达式本质上是定义一个匿名内部类。(可以把lambda表达式等价于一个接口)
匿名内部类,可以对接口和抽象类进行使用,直接生成其子类或实现类对象。lambda表达式就是一种使用匿名内部类的简化方法,但lambda表达式的适用范围仅仅是接口,且接口内只能有一个抽象方法。
3,lambda表达式的使用
- 形参位置
- 成员变量位置
- 返回值位置
4,lambda常见应用场景
- 遍历集合
String[] atp = {"Rafael Nadal", "Novak Djokovic",
"Stanislas Wawrinka",
"David Ferrer","Roger Federer",
"Andy Murray","Tomas Berdych",
"Juan Martin Del Potro"};
List<String> players = Arrays.asList(atp);
// 以前的循环方式
for (String player : players) {
System.out.print(player + "; ");
}
// 使用 lambda 表达式以及函数操作(functional operation)
//forEach也是一个接口
players.forEach((player) -> System.out.print(player + "; "));
// 在 Java 8 中使用双冒号操作符(double colon operator)
players.forEach(System.out::println);