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)格式的时候,往往我们就可以简化成方法引用了。
举例如下:使用forEach对ArrayList进行遍历
写法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); //使用lambda,System.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); |