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 );
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。