1.Lambda表达式:可以称为闭包,Lambda语法来代替匿名的内部类,代码不仅简洁,而且还可读,最重要的是代码量也随之减少很多。
1.1语法:(parameters) -> expression或(parameters) ->{statements;}
():参数列表;
->: 运算符;
即:() -> lambda主体(单一表达式或语句块)
1.2变量作用域:只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误
1.3 eg:
无参数:
//不使用Lambda表达式
1 Runnable runnable1=new Runnable(){ 2 @Override 3 public void run(){ 4 System.out.println("Running without Lambda"); 5 } 6 };
//使用Lambda表达式
1 Runnable runnable2=()->System.out.println("Running from Lambda");
一个参数:x -> 2 * x ;
两个参数:(x, y) -> x – y ;
2.方法引用:通过方法的名字来指向一个方法,可以使语言的构造更紧凑简洁,减少冗余代码。
语法:使用一对冒号 ::。
1 @FunctionalInterface 2 public interface Supplier<T> { 3 T get(); 4 } 5 6 class Car { 7 //Supplier是jdk1.8的接口,这里和lamda一起使用了 8 public static Car create(final Supplier<Car> supplier) { 9 return supplier.get(); 10 } 11 12 public static void collide(final Car car) { 13 System.out.println("Collided " + car.toString()); 14 } 15 16 public void follow(final Car another) { 17 System.out.println("Following the " + another.toString()); 18 } 19 20 public void repair() { 21 System.out.println("Repaired " + this.toString()); 22 } 23 }
-
构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:
final Car car = Car.create( Car::new ); final List< Car > cars = Arrays.asList( car ); -
静态方法引用:它的语法是Class::static_method,实例如下:
cars.forEach( Car::collide ); -
特定类的任意对象的方法引用:它的语法是Class::method实例如下:
cars.forEach( Car::repair ); -
特定对象的方法引用:它的语法是instance::method实例如下:
final Car police = Car.create( Car::new ); cars.forEach( police::follow );
3.函数式接口:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口可以被隐式转换为 lambda 表达式。