方法的引用方式是用—>类名::方法名
具体写法:
构造器的引用 Class::new
静态方法引用 Class::静态方法名称
特定的类的任意对对象引用 Class::非静态方法名称
特定对象的方法引用 对象::非静态方法名称
其本质还是lambda表达式
//java7写法
Car car1=Car.create(new Supplier<Car>(){
public Car get(){
return new Car();
}
});
System.out.println(car1);
//java8的lambda的写法
Car car2=Car.create(()->{return new Car();});
System.out.println(car2);
//java8的方法的引用 构造方法的引用,替代了接口中重写的get方法
Car car3=Car.create(Car::new);//Car::new等价于()->{return new Car();}
System.out.println(car3);
//java8的方法的引用 静态方法的引用 Class::staticmethod
List<Car> cars=Arrays.asList(car1,car2,car3);
cars.forEach(Car::collide);//Car::collide等价于(car)->Car.collide(car)
//等价于
cars.forEach((car)->Car.collide(car));
//java8的方法的引用 用非静态方法引用 Class::method
cars.forEach(Car::repair);
//等价于
cars.forEach((car)->car.repair());
//java8的方法的引用 用指定对象调用非静态方法 instacne对象::method
Car car4=Car.create(Car::new);
cars.forEach(car4::follow);
//等价于
cars.forEach((car)->car4.follow(car));
Car类:
public class Car {
//静态创建
public static Car creat(final Supplier<Car> suppier){
return suppier.get();
}
//静态碰撞方法
public static void collide(final Car car){
System.out.println("碰撞-->"+car.toString());
}
//非静态跟随
public void follow(final Car car){
System.out.println("跟随-->"+car.toString());
}
public void repair(){
System.out.println("维修-->"+this.toString());
}
}
Supplier接口:
@FunctionalInterface
public interface Supplier<T>{
public T get();
}