1、方法引用通过方法的名字来指向一个方法。
2、方法引用使用一对冒号 :: 。
下面这段代码,将展现对于不同方法的引用规则
package com.wj.java8.testPackage.methodUseTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
/**
* 方法引用
*/
class Fruit {
private String name;
//Supplier是jdk1.8的接口,这里和lamda一起使用了
public static Fruit create(final Supplier<Fruit> supplier) {
return supplier.get();
}
public static void collide(final Fruit car) {
System.out.println("Collided " + car.toString());
}
public void follow(final Fruit another) {
System.out.println("Following the " + another.toString());
}
public void repair() {
System.out.println("Repaired " + this.toString());
}
public static void main(String[] args) {
//构造器引用,语法是Class::new
final Fruit fruit = Fruit.create( Fruit::new );
final List< Fruit > cars = Arrays.asList( fruit );
//静态方法引用:语法是Class::static_method
cars.forEach(Fruit::collide);
//特定类的任意对象的方法引用:语法是Class::method
cars.forEach(Fruit::repair);
//特定对象的方法引用:语法是instance::method
final Fruit fruit1 = Fruit.create(Fruit::new);
cars.forEach(fruit1::follow);
List fruits = new ArrayList();
fruits.add("apple");
fruits.add("pear");
fruits.add("banana");
fruits.add("peach");
fruits.add("grape ");
fruits.forEach(System.out::println);
}
}
结果打印:
Collided com.wj.java8.testPackage.methodUseTest.Fruit@7106e68e
Repaired com.wj.java8.testPackage.methodUseTest.Fruit@7106e68e
Following the com.wj.java8.testPackage.methodUseTest.Fruit@7106e68e
apple
pear
banana
peach
grape
我们可以看到,方法引用可以使语言的构造更紧凑简洁,减少了很多的冗余代码,刚开始感觉有点难懂,不够表达本来的逻辑意思,是因为我们使用习惯了以前的语法规则,对于新事物毕竟要留一点时间去接受。