前言
在Lambda表達式中主要有4種方法引用:
1.類::靜態方法 (靜態方法引用)
2.對象::方法 (特定對象的實例方法引用)
3.類::方法 (對象實例方法引用)
4.構造器方法引用
當參數列表的值原原本本傳遞給方法體中的方法時,可以用方法引用的方式來書寫
使用
基礎類準備
@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接口。