1. 介绍
前面讲的lambda表达式,已经简化了匿名类的写法,而我们使用方法引用结合lambda表达,可以更加简化写法,
可以看一下下面的示例:
List<Integer> values = Arrays.asList(1,2);
//lambda表达式写法
values.forEach(v->System.out.println(v));
//方法引用写法
values.forEach(System.out::println);
2. 方法引用的类型
- 静态方法引用:类名::静态方法,代表(参数)->类名.静态方法名(参数)
- 构造方法引用:类名::new, 代表(参数)->new 类名(参数)
- 实例方法引用:对象::实例方法 代表(实例变量,参数)->实例变量.方法名(参数)
- 类方法引用 : 类名::类方法 代表(参数)->类名.方法名(参数)
- 数组构造引用:类名[]::new 代表(参数)->new 类名[]
3. 实例
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
class MyClass {
private int a;
MyClass(){
System.out.println("init...");
}
MyClass(int a){
this.a = a;
}
public static void testStatic(MyClass c){
System.out.println("static method");
}
public int test(){
System.out.println("test method");
return 1;
}
public void testObj(MyClass c){
System.out.println("testObj method");
}
}
public class MethodRefeTest {
public static void main(String[] args) {
//构造方法引用
Supplier<MyClass> c1 = MyClass::new;
MyClass myClass = c1.get();
List<MyClass> myClassList = Arrays.asList(myClass);
//类方法引用
myClassList.forEach(MyClass::test);
//实例方法引用
myClassList.forEach(myClass::testObj);
//静态方法引用
myClassList.forEach(MyClass::testStatic);
}
}
注意:上面的方法引用代表的函数,需要和函数式接口的参数保持一致,不然编译的时候就会有提示错误,
实际上可以看出,方法引用也就是lambda表达式的简要书写形式。