1. 介紹
前面講的lambda表達(dá)式,已經(jīng)簡化了匿名類的寫法,而我們使用方法引用結(jié)合lambda表達(dá),可以更加簡化寫法,
可以看一下下面的示例:
List<Integer> values = Arrays.asList(1,2);
//lambda表達(dá)式寫法
values.forEach(v->System.out.println(v));
//方法引用寫法
values.forEach(System.out::println);
2. 方法引用的類型
- 靜態(tài)方法引用:類名::靜態(tài)方法,代表(參數(shù))->類名.靜態(tài)方法名(參數(shù))
- 構(gòu)造方法引用:類名::new, 代表(參數(shù))->new 類名(參數(shù))
- 實(shí)例方法引用:對象::實(shí)例方法 代表(實(shí)例變量,參數(shù))->實(shí)例變量.方法名(參數(shù))
- 類方法引用 : 類名::類方法 代表(參數(shù))->類名.方法名(參數(shù))
- 數(shù)組構(gòu)造引用:類名[]::new 代表(參數(shù))->new 類名[]
3. 實(shí)例
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) {
//構(gòu)造方法引用
Supplier<MyClass> c1 = MyClass::new;
MyClass myClass = c1.get();
List<MyClass> myClassList = Arrays.asList(myClass);
//類方法引用
myClassList.forEach(MyClass::test);
//實(shí)例方法引用
myClassList.forEach(myClass::testObj);
//靜態(tài)方法引用
myClassList.forEach(MyClass::testStatic);
}
}
注意:上面的方法引用代表的函數(shù),需要和函數(shù)式接口的參數(shù)保持一致,不然編譯的時(shí)候就會有提示錯誤,
實(shí)際上可以看出,方法引用也就是lambda表達(dá)式的簡要書寫形式。