什么是方法引用

方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 ::

下面,在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不同方法的引用。

  1. @FunctionalInterface
  2. public interface Supplier<T> {
  3. T get();
  4. }
  5. class Car {
  6. //Supplier是jdk1.8的接口,这里和lambda一起使用了
  7. public static Car create(final Supplier<Car> supplier) {
  8. return supplier.get();
  9. }
  10. public static void collide(final Car car) {
  11. System.out.println("Collided " + car.toString());
  12. }
  13. public void follow(final Car another) {
  14. System.out.println("Following the " + another.toString());
  15. }
  16. public void repair() {
  17. System.out.println("Repaired " + this.toString());
  18. }
  19. }

构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:

  1. final Car car = Car.create(Car::new);
  2. final List<Car> cars = Arrays.asList(car);


静态方法引用:它的语法是Class::static_method,实例如下:

  1. cars.forEach(Car::collide);


特定类的任意对象的方法引用:它的语法是Class::method实例如下:

  1. cars.forEach(Car::repair);


特定对象的方法引用:它的语法是instance::method实例如下:

  1. final Car police = Car.create(Car::new);
  2. cars.forEach(police::follow);

方法引用实例

循环输出:

  1. public class Java8Tester {
  2. public static void main(String args[]){
  3. List<String> names = new ArrayList();
  4. names.add("Google");
  5. names.add("Runoob");
  6. names.add("Taobao");
  7. names.add("Baidu");
  8. names.add("Sina");
  9. names.forEach(System.out::println);
  10. }
  11. }

执行以上脚本输出:

  1. Google
  2. Runoob
  3. Taobao
  4. Baidu
  5. Sina