一、方法引用概述
1.方法引用是lambda表達式一種簡寫的方式,回憶lambda表達式,它由接口申明和方法定義組成,而在方法引用中方法的定義已然讓有符合接口定義的方法代替,不用重新定義方法。
2.方法引用有四種基本方式:①Class::new:獲取該實例對象;
②Class::static_method:調用該class的靜態方法;
③Class::method:調用該class的任意方法;
④instance::method:調用該實例的任意方法。
二、基本功能使用
1 public class FunctionRefer { 2 /* 3 *內部接口定義 4 */ 5 interface FunctionOperator{ 6 int sum(int a ,int b); 7 } 8 9 /* 10 * 靜態方法的引用或任意對象方法引用:Class::method 11 */ 12 @Test 13 public void add(){ 14 //lumbda表達式執行的過程 15 FunctionOperator functionOperator = (a,b)->a+b; 16 Consumer<String> consumer = System.out::println; 17 consumer.accept("lumbda執行結果:"+functionOperator.sum(1,2)); 18 //函數引用過程,因為在Math中有個靜態方法 19 FunctionOperator functionOperator1 = Math::addExact; 20 consumer.accept("lumbda執行結果:"+functionOperator1.sum(1,2)); 21 } 22 23 class FunctionReferImpl implements FunctionOperator{ 24 @Override 25 public int sum(int a, int b) { 26 return a+b; 27 } 28 } 29 30 /** 31 * 特定對象的引用 32 */ 33 @Test 34 public void objectRefer(){ 35 //supplier是jdk1.8的函數,這個函數定義是有一個返回值,無入參,與創建實例對象的構造函數方法定義相同可以接收 36 Supplier<FunctionOperator> fun = FunctionReferImpl::new; 37 FunctionOperator functionOperator = fun.get(); 38 FunctionOperator functionOperator1 = functionOperator::sum; 39 Consumer<String> consumer = System.out::println; 40 consumer.accept("方法引用方式:"+functionOperator1.sum(1,2)); 41 } 42 }
三、總結
1.在方法引用上面注意點:
①該引用的函數必定與定義的接口形參和返回值類型一致;
②調用靜態方法和調用實例方法時使用的調用對象是不一樣的,一個是Class,一個是instance;
③其實在方法引用上面還有許多函數式接口的引用(可以參考java.util.function)。
④常用function:Function:接受一個輸入參數,返回一個結果;BiFunction:接受兩個參數返回一個對象;Consumer:接受一個輸入參數並且無返回操作,accept;Predicate:接受一個輸入參數,返回一個布爾值結果
Supplier:無參數,返回一個結果。