Java中的方法引用與Lambda表示式一樣,同樣式函數語言程式設計的一種體現,允許將方法作為引數傳遞給另一個方法,區別於Lambda表示式需要在傳遞的時候進行定義,方法引用必須是物件已經存在的實現好的方法,從而進一步簡化函數語言程式設計的程式碼。
語法:
類名::靜態方法名
物件名::例項方法名
示例:
List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
// 使用::方法引用的方式將方法作為引數傳入另一個方法
names.forEach(System.out::println);
函式式介面: 同Lambda表示式一樣,方法引用同樣只能用於函式式介面(只有一個抽象方法的介面),即將另一個已實現的方法作為該介面抽象方法的實現。需要注意的是,方法引用的引數列表需要和介面中抽象方法的引數定義一致。
示例:由於自定義的IntegerUtil.myCmp方法與Collections.sort方法引數中要求的Comparable介面的compare抽象方法引數列表一致,所以可以直接使用方法引用。
public class IntegerUtil {
// 該方法的引數列表與Comparable介面的compare方法引數列表一致
public static int myCmp(Integer int1, Integer int2) {
return int1.compareTo(int2);
}
}
public class Main {
public static void main(String[] args) {
List<Integer> nums = Arrays.asList(33, 22, 11);
// 只要方法引用的方法與介面中抽象方法的引數列表一致,就可以直接方法引用
Collections.sort(nums, IntegerUtil::myCmp);
// 輸出:[11, 22, 33]
System.out.println(nums);
}
}
引用類的例項方法: 例如使用Lambda表示式 (var1, var2, var3) -> var1.func(var2, var3)
,採用方法引用則寫為 var1.className::func
,示例如下:
List<Integer> nums = Arrays.asList(33, 22, 11);
// Lambda表示式寫法:Collections.sort(nums, (num1, num2) -> num1.compareTo(num2));
Collections.sort(nums, Integer::compareTo);