在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。 Arrays.sort(stringsArray, String::compareToIgnoreCase); 这种特性就叫做方法引用(Method Reference)。 方法引用的形式 方法引
在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));
//使用方法引用
//引用的是类的静态方法
引用对象的实例方法
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));
//使用方法引用
//引用的是类型对象的实例方法
引用构造方法
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);
数组构造方法引用
组成语法格式:TypeName[]::new
例子:
int[]::new 是一个含有一个参数的构造器引用,这个参数就是数组的长度。等价于lambda表达式 x -> new int[x]。
假想存在一个接收int参数的数组构造方法
IntFunction<int[]> arrayMaker = int[]::new;int[] array = arrayMaker.apply(10) // 创建数组 int[10]