欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

30分钟入门Java8之方法引用学习

程序员文章站 2024-03-01 15:47:58
前言 之前两篇文章分别介绍了java8的和方法。今天我们继续学习java8的新语言特性——方法引用(method references)。 在学习lambda表达式之后...

前言

之前两篇文章分别介绍了java8的和方法。今天我们继续学习java8的新语言特性——方法引用(method references)。

在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下:

 arrays.sort(stringsarray,(s1,s2)->s1.comparetoignorecase(s2)); 

在java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。

arrays.sort(stringsarray, string::comparetoignorecase); 

这种特性就叫做方法引用(method reference)。

方法引用的形式

方法引用的标准形式是: 类名::方法名 。(注意:只需要写方法名,不需要写括号)

有以下四种形式的方法引用:

类型 示例
引用静态方法 containingclass::staticmethodname
引用某个对象的实例方法 containingobject::instancemethodname
引用某个类型的任意对象的实例方法 containingtype::methodname
引用构造方法 classname::new

下面我们通过一个小demo来分别学习这几种形式的方法引用:

 public  class  person { 

    public  enum  sex{ 

      male,female 

    } 

 

    string name; 

    localdate birthday; 

    sex gender; 

    string emailaddress; 

 

    public  string getemailaddress() { 

      return  emailaddress; 

    } 

 

    public  sex getgender() { 

      return  gender; 

    } 
    public  localdate getbirthday() { 

      return  birthday; 

    } 

 

    public  string getname() { 

      return  name; 

    } 

    public  static  int  comparebyage(person a,person b){ 

      return  a.birthday.compareto(b.birthday); 

    }

 } 

引用静态方法

 person [] persons = new person[10];

//使用匿名类
arrays.sort(persons, new comparator<person>() {
      @override
      public int compare(person o1, person o2) {
        return o1.birthday.compareto(o2.birthday);
      }
 });

//使用lambda表达式
arrays.sort(persons, (o1, o2) -> o1.birthday.compareto(o2.birthday));

//使用lambda表达式和类的静态方法
arrays.sort(persons, (o1, o2) -> person.comparebyage(o1,o2));

//使用方法引用
//引用的是类的静态方法
arrays.sort(persons, person::comparebyage);

引用对象的实例方法

 class  comparisonprovider{ 

        public  int  comparebyname(person a,person b){ 

          return  a.getname().compareto(b.getname()); 

        } 

 

        public  int  comparebyage(person a,person b){ 

          return  a.getbirthday().compareto(b.getbirthday()); 

        } 

      } 

 

 comparisonprovider provider =  new  comparisonprovider(); 

 

 //使用lambda表达式 

 //对象的实例方法 

 arrays.sort(persons,(a,b)->provider.comparebyage(a,b)); 

 

 //使用方法引用 

 //引用的是对象的实例方法 

 arrays.sort(persons, provider::comparebyage); 

引用类型对象的实例方法

 string[] stringsarray = { "hello" , "world" }; 

 //使用lambda表达式和类型对象的实例方法 

 arrays.sort(stringsarray,(s1,s2)->s1.comparetoignorecase(s2)); 

 //使用方法引用 

 //引用的是类型对象的实例方法 

 arrays.sort(stringsarray, string::comparetoignorecase); 

引用构造方法

 public  static  <t, source  extends  collection<t>, dest  extends  collection<t>> 

    dest transferelements(source sourcecolletions, supplier<dest> colltionfactory) { 

      dest result = colltionfactory.get(); 

      for  (t t : sourcecolletions) { 

        result.add(t); 

      } 

      return  result; 

    } 

 ... 

  

 final  list<person> personlist = arrays.aslist(persons); 

 

 //使用lambda表达式 

 set<person> personset = transferelements(personlist,()->  new  hashset<>()); 

 

 //使用方法引用 

 //引用的是构造方法 

 set<person> personset2 = transferelements(personlist, hashset:: new );  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。