方法引用
1、什么時候用方法引用
當要傳遞給Lambda體的操作,已經有實現的方法了,可以使用方法引用。
2、方法引用是什么
方法引用可以看做是Lambda表達式深層次的表達。換句話說,方法引用就
是Lambda表達式,也就是函數式接口的一個實例,通過方法的名字來指向
一個方法,可以認為是Lambda表達式的一個語法糖。
3、方法引用的要求
實現接口的抽象方法的參數列表和返回值類型,必須與方法引用的 方法的參數列表和返回值類型保持一致!(方法名可以不同)
4、方法引用的格式
使用操作符 “::” 將類(或對象) 與 方法名分隔開來。
1.常規方法引用
如下三種主要使用情況:
- 對象實例::方法名
- 類靜態::方法名
- 類實例::方法名
2.特殊的方法引用
1.構造器引用
格式: ClassName::new
與函數式接口相結合,自動與函數式接口中方法兼容。 可以把構造器引用賦值給定義的方法,要求構造器參數列表要與接口中抽象 方法的參數列表一致!且方法的返回值即為構造器對應類的對象。

2.數組引用
格式: type[] :: new

5、方法引用的實例
// 情況一:對象 :: 實例方法
//Consumer中的void accept(T t)
//PrintStream中的void println(T t)
@Test
public void test1() {
Consumer<String> con1 = s-> System.out.println(s);
con1.accept("北京");
PrintStream ps = new PrintStream(System.out);
Consumer<String> con2 = ps::println;
con2.accept("南京");
}
/ 情況二:類 :: 靜態方法
//Comparator中的int compare(T t1,T t2)
//Integer中的int compare(T t1,T t2)
@Test
public void test3() {
Comparator<Integer> c1 = (o1,o2)-> Integer.compare(o1,o2);
System.out.println(c1.compare(12, 23));
Comparator<Integer> c2 = Integer::compareTo;
System.out.println(c2.compare(12, 12));
}
當涉及到的兩個參數,一個是另一個的調用者的時候,可用情況三。
// 情況三:類 :: 實例方法
// Comparator中的int comapre(T t1,T t2)
// String中的int t1.compareTo(t2) t1作為調用者出現
@Test
public void test5() {
Comparator<String> c1 = (s1,s2)->s1.compareTo(s2);
System.out.println(c1.compare("abc", "abd"));
Comparator<String> c2 = String::compareTo;
System.out.println(c2.compare("abc", "abm"));
}
