Java基礎知識19--方法引用(::)


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]

參考文獻:

https://www.cnblogs.com/JohnTsai/p/5806194.html----推薦

https://www.cnblogs.com/tigerlion/p/11182864.html

https://www.runoob.com/java/java8-method-references.html

https://blog.csdn.net/wsgytwsgyt/article/details/80273678


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM