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