前言
在Lambda表达式中主要有4种方法引用:
1.类::静态方法 (静态方法引用)
2.对象::方法 (特定对象的实例方法引用)
3.类::方法 (对象实例方法引用)
4.构造器方法引用
用来替代某些特定形式Lambda表达式。如果Lambda表达式的全部内容就是调用一个已有的方法,那么可以用方法引用来替代Lambda表达式。(当参数列表的值原原本本传递给方法体中的方法时,可以用方法引用的方式来书写)
使用
基础类准备
@Getter@Setter@ToString
public class Person implements Comparable<Person> {
private String name;
@Override
public int compareTo(Person o) {
return this.getName().compareTo(o.getName());
}
public int compare2(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
}
用于演示构造器引用的类
public class PersonFactory {
private Supplier<Person> supplier;
public PersonFactory(Supplier<Person> supplier) {
this.supplier = supplier;
}
public Person getPerson(){
return supplier.get();
}
}
测试
public class MethodRefTest {
@Test
public void test() {
PersonFactory personFactory_old = new PersonFactory(() -> new Person());
//构造器方法引用
PersonFactory personFactory_new = new PersonFactory(Person::new);
Person p1 = personFactory_new.getPerson();
Person p2 = personFactory_new.getPerson();
Person p3 = personFactory_new.getPerson();
List<Person> list = new ArrayList<>();
p1.setName("person1");
list.add(p1);
p2.setName("person2");
list.add(p2);
p3.setName("person3");
list.add(p3);
list.sort(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getName().compareTo(o2.getName());
}
});
//1.类::静态方法 (静态方法引用)
list.sort(MethodRefTest::staticCompare);
//2.对象::方法 (特定对象的实例方法引用)
list.sort(p1::compare2);
//3.类::方法 (对象实例方法引用)
list.sort(Person::compareTo);
}
public static int staticCompare(Person x, Person y) {
return x.getName().compareTo(y.getName());
}
}
总结
构造方法引用对应的函数式接口的里的抽象方法一定是: 返回一个对象,并且方法没有参数.符合这两个条件的接口jdk已经提供了,那就是Supplier接口。