30分钟入门Java8之方法引用学习
前言
之前两篇文章分别介绍了Java8的lambda表达式和默认方法和静态接口方法。今天我们继续学习Java8的新语言特性——方法引用(MethodReferences)。
在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下:
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。
Arrays.sort(stringsArray,String::compareToIgnoreCase);
这种特性就叫做方法引用(MethodReference)。
方法引用的形式
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)
有以下四种形式的方法引用:
| 类型 | 示例 | 引用静态方法 | ContainingClass::staticMethodName | 引用某个对象的实例方法 | containingObject::instanceMethodName | 引用某个类型的任意对象的实例方法 | ContainingType::methodName | 引用构造方法 | ClassName::new |
|---|
下面我们通过一个小Demo来分别学习这几种形式的方法引用:
publicclassPerson{
publicenumSex{
MALE,FEMALE
}
Stringname;
LocalDatebirthday;
Sexgender;
StringemailAddress;
publicStringgetEmailAddress(){
returnemailAddress;
}
publicSexgetGender(){
returngender;
}
publicLocalDategetBirthday(){
returnbirthday;
}
publicStringgetName(){
returnname;
}
publicstaticintcompareByAge(Persona,Personb){
returna.birthday.compareTo(b.birthday);
}
}
引用静态方法
Person[]persons=newPerson[10]; //使用匿名类 Arrays.sort(persons,newComparator(){ @Override publicintcompare(Persono1,Persono2){ returno1.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);
引用对象的实例方法
classComparisonProvider{
publicintcompareByName(Persona,Personb){
returna.getName().compareTo(b.getName());
}
publicintcompareByAge(Persona,Personb){
returna.getBirthday().compareTo(b.getBirthday());
}
}
ComparisonProviderprovider=newComparisonProvider();
//使用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);
引用构造方法
publicstatic,DESTextendsCollection > DESTtransferElements(SOURCEsourceColletions,Supplier colltionFactory){ DESTresult=colltionFactory.get(); for(Tt:sourceColletions){ result.add(t); } returnresult; } ... finalList personList=Arrays.asList(persons); //使用lambda表达式 Set personSet=transferElements(personList,()->newHashSet<>()); //使用方法引用 //引用的是构造方法 Set personSet2=transferElements(personList,HashSet::new);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。