JAVA8新特性——方法引用


  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 }

  小結:有點毀三觀的感覺!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM