java8的新特性


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 ListCar > 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 表达式。

posted @ 2018-11-07 22:06  talenter  阅读(639)  评论(0编辑  收藏  举报