> 文档中心 > java8新特性之方法引用(直接用案例教会你使用)

java8新特性之方法引用(直接用案例教会你使用)


一、什么是方法引用

方法引用是一个更加紧凑,易读的 Lambda 表达式,注意方法引用是一个 Lambda 表达式,其中方法引用的操作符是双冒号 "::"

二、四种不同的方法引用

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

public static class Car {

    public static Car create( final Supplier supplier ) {

        return supplier.get();

    }              

    public static void collide( final Car car ) {

        System.out.println( "Collided " + car.toString() );

    }

    public void follow( final Car another ) {

        System.out.println( "Following the " + another.toString() );

    }

    public void repair() {   

        System.out.println( "Repaired " + this.toString() );

    }

}

1、构造器引用

语法是Class::new,或者更一般的形式:Class::new。注意:这个构造器没有参数。

final Car car = Car.create( Car::new );

final List cars = Arrays.asList( car );

2、静态方法引用

语法是Class::static_method。注意:这个方法接受一个Car类型的参数。

cars.forEach( Car::collide );

3、某个类的成员方法引用

语法是Class::method,注意,这个方法没有定义入参:

cars.forEach( Car::repair );

4、某个实例对象的成员方法引用

语法是instance::method。注意:这个方法接受一个Car类型的参数:

final Car police = Car.create( Car::new );

cars.forEach( police::follow );

三、方法引用的特点

当出现:x->Object(x)格式的时候,往往我们就可以简化成方法引用了。

举例如下:使用forEachArrayList进行遍历
写法1:匿名内部类

        Integer[] arr={1,2,3,4,5,6};

        List list = Arrays.asList(arr);

        //使用匿名内部类

        list.forEach(new Consumer() {

            @Override

            public void accept(Integer x) {

                System.out.println(x);

            }

        });

forEach方法源码

 default void forEach(Consumer action) {

        Objects.requireNonNull(action);

        for (T t : this) {

            action.accept(t);

        }

    }

写法2:使用lambda表达式简化

         Integer[] arr={1,2,3,4,5,6};

        List list = Arrays.asList(arr);

        //使用lambdaSystem.out是一个对象,println是对象上的一个方法

        list.forEach((x) ->System.out.println(x));

写法3:使用方法引用

Integer[] arr={1,2,3,4,5,6};

        List list = Arrays.asList(arr);

        //使用方法引用

        list.forEach(System.out::println);