JAVA9都要出來了,JAVA8新特性都沒搞清楚,是不是有點掉隊哦~
在Lamda新特性的支持下,JAVA8中可以使用lamda表達式來創建匿名方法。然而,有時候我們僅僅是需要調用一個已存在的方法(如java中已經定義好的方法),在這時候java8新特性“方法引用”將會進一步簡化操作(注意:需要有Lamda的支持)。
方法引用的四種形式:
- 引用靜態方法-->類名稱::static 方法名稱;
- 引用某個對象的實例的普通方法-->示例化對象::普通方法;
- 引用某個類型的任意對象的實例的普通方法-->特定類::普通方法;
- 引用構造方法-->類名稱::new
引用靜態方法
如:String類中的valueOf()方法:public static String valueOf(int x);
1 /** 2 * 實現方法的引用接口 3 * @param <P>引用方法的參數類型 4 * @param <R>引用方法的返回類型 5 */ 6 interface MyInterface<P,R>{ 7 public R function(P p);//和String.valueOf(int x)類似 8 } 9 10 interface MyInterface1{ 11 String function(Integer a); 12 } 13 14 public class Main { 15 16 public static void test(MyInterface1 myInterface1){ 17 String result = myInterface1.function(2000); 18 System.out.println(result+" --"); 19 } 20 21 public static void main(String[] args) { 22 23 //匿名內部類實現 24 test(new MyInterface1() { 25 @Override 26 public String function(Integer a) { 27 return String.valueOf(a); 28 } 29 }); 30 31 //Lamda表達式實現 32 test((a)->String.valueOf(a)); 33 34 //方法引用實現:引用類的靜態方法 35 MyInterface<Integer,String> msg = String::valueOf; 36 String str = msg.function(2000); 37 System.out.println(str); 38 } 39 }
引用某個對象的實例的普通方法
如:String類中的toUpperCase()方法:public String toUpperCase();
這個方法沒有參數,但是有返回值,並且這個方法一定要在有實例化對象的時候才可以調用。
1 interface MyInterface2<R>{ 2 public R upper(); 3 } 4 public class Main1 { 5 public static void main(String[] args) { 6 String str = new String("hello"); 7 MyInterface2<String> msg = str::toUpperCase; 8 System.out.println(msg.upper());//調用upper方法,就相當於調用toUpperCase方法 9 } 10 }
在上面的演示中已經發現,如果要實現方法的引用,就必須要有接口,並且這個接口中只能存在一個方法,否則方法是無法進行引用的。
所以為了保證被引用的接口里面只能夠定義一個方法,就要在接口上加以限制,使用@FunctionalInterface 注解。
1 @FunctionalInterface //此為函數式接口,只能夠定義一個方法 2 interface MyInterface2<R>{ 3 public R upper(); 4 }
引用某個類型的任意對象的實例的普通方法
比如:String類中的compareTo(String str1,String str2)方法 public int compareTo(String anotherString);
如果要進行比較的話,比較的形式:字符串1對象.compareTo(字符串2對象),要准備兩個參數。
1 @FunctionalInterface //此為函數式接口,只能夠定義一個方法 2 interface MyInterface3<P>{ 3 public int compare(P p1,P p2); 4 } 5 public class Main2 { 6 public static void main(String[] args) { 7 MyInterface3<String> msg = String::compareTo; 8 System.out.println(msg.compare("A","B")); 9 } 10 }
與之前相比,方法引用前不需要再定義對象,而是可以理解為將對象定義在了參數中。
引用構造方法
1 @FunctionalInterface //此為函數式接口,只能夠定義一個方法 2 interface MyInterface4<C>{ 3 public C person(String n,int a); 4 } 5 class Person{ 6 private String name; 7 private int age; 8 9 public Person(String name, int age) { 10 this.name = name; 11 this.age = age; 12 } 13 @Override 14 public String toString() { 15 return "姓名:"+this.name+",年齡:"+this.age; 16 } 17 } 18 public class Main3 { 19 public static void main(String[] args) { 20 MyInterface4<Person> msg = Person::new;//引用構造方法 21 Person person = msg.person("小明",20); 22 System.out.println(person); 23 } 24 }
小結:有點毀三觀的感覺!