java8(二)方法引用

前言

在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接口。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章