1.概述
方法引用(Method Reference)是lambda表达式的一种特殊形式,如果正好有某个方法满足一个lambda表达式的形式,那就可以将这个lambda表达式用方法引用的方式表示,但是如果这个lambda表达式的比较复杂就不能用方法引用进行替换。实际上方法引用是lambda表达式的一种语法糖。
方法引用通过方法的名字来指向一个方法。方法引用可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号 :: 。
方法引用共分为四类:
1.类名::静态方法名
2.对象::实例方法名
3.类名::实例方法名
4.类名::new
入门案例:
public class MethodReferenceTest {
static void printStr(Consumer<String> c, String s) {
// 借助Consumer接口,accept方法可以接收参数
c.accept(s);
}
public static void main(String[] args) {
printStr(s -> System.out.println(s), "Lambda写法");
// 使用方法引用的前提:
// |--对象已经存在(System.out)
// |--方法也存在(println())
// |--参数是方法可接收类型(String)
printStr(System.out::println, "方法引用:连参数都不写");
}
}
控制台输出:
Lambda写法
方法引用:连参数都不写
2.引用静态方法
Person实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private String age;
public static int compareByAge(Person a,Person b){
return a.age.compareTo(b.age);
}
}
案例:
public class MethodReferenceTest {
public static void main(String[] args) {
Person[] persons = new Person[3];
persons[0]=new Person("lucky","25");
persons[1]=new Person("linda","21");
persons[2]=new Person("peter","28");
//使用匿名类
Arrays.sort(persons, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge().compareTo(o2.getAge());
}
});
//使用lambda表达式
Arrays.sort(persons, (o1, o2) -> o1.getAge().compareTo(o2.getAge()));
//使用lambda表达式和类的静态方法
Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2));
//使用方法引用
//引用的是类的静态方法
Arrays.sort(persons, Person::compareByAge);
System.out.println(Arrays.toString(persons));
}
}
控制台输出:
[Person(name=linda, age=21), Person(name=lucky, age=25), Person(name=peter, age=28)]
3.引用对象的实例方法
案例:
public class MethodReferenceTest {
public static void main(String[] args) {
Person[] persons = new Person[3];
persons[0]=new Person("lucky","25");
persons[1]=new Person("linda","21");
persons[2]=new Person("peter","28");
class ComparisonProvider{
public int compareByName(Person a,Person b){
return a.getName().compareTo(b.getName());
}
public int compareByAge(Person a,Person b){
return a.getAge().compareTo(b.getAge());
}
}
ComparisonProvider provider = new ComparisonProvider();
//使用lambda表达式
//对象的实例方法
Arrays.sort(persons,(a,b)->provider.compareByAge(a,b));
//使用方法引用
//引用的是对象的实例方法
Arrays.sort(persons, provider::compareByAge);
System.out.println(Arrays.toString(persons));
}
}
控制台输出:
[Person(name=linda, age=21), Person(name=lucky, age=25), Person(name=peter, age=28)]
4.引用类型对象的实例方法
案例:
public class MethodReferenceTest {
public static void main(String[] args) {
String[] stringsArray = {"Hello","World"};
//使用lambda表达式和类型对象的实例方法
Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
//使用方法引用
//引用的是类型对象的实例方法
Arrays.sort(stringsArray, String::compareToIgnoreCase);
System.out.println(Arrays.toString(stringsArray));
}
}
控制台输出:
[Hello, World]