1. 程式人生 > >Java 8 方法引用

Java 8 方法引用

bar ria john 點擊 targe ati void linda icu

Java 8 方法引用

There are four kinds of method references:

Kind Example
Reference to a static method ContainingClass::staticMethodName
Reference to an instance method of a particular object containingObject::instanceMethodName
Reference to an instance method of an arbitrary object of a particular type ContainingType::methodName
Reference to a constructor ClassName::new

方法引用通過方法的名字來指向一個方法。
方法引用可以使語言的構造更緊湊簡潔,減少冗余代碼。
方法引用使用一對冒號 :: 。

下面,我們定義了 4 個方法作為例子來區分 Java 中 4 種不同方法的引用。

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;

public class ComparisonProvider {

    public int compareByName(Person a, Person b) {
        return a.getName().compareTo(b.getName());
    }

    public static int compareByAge(Person a, Person b) {
        return a.getBirthday().compareTo(b.getBirthday());
    }

    public static void main(String[] args) {
        List<Person> roster = Person.createRoster();
        Person[] rosterAsArray = roster.toArray(new Person[roster.size()]);

        // 特定對象的實例方法引用: containingObject::instanceMethodName
        ComparisonProvider myComparisonProvider = new ComparisonProvider();
        System.out.println("排序前:" + Arrays.toString(rosterAsArray));
        Arrays.sort(rosterAsArray, myComparisonProvider::compareByName);
        System.out.println("排序後:" + Arrays.toString(rosterAsArray));

        // 靜態方法引用:ContainingClass::staticMethodName
        System.out.println("排序前:" + Arrays.toString(rosterAsArray));
        Arrays.sort(rosterAsArray, ComparisonProvider::compareByAge);
        System.out.println("排序後:" + Arrays.toString(rosterAsArray));

        // 特定類型的任意對象的實例方法的引用: ContainingType::methodName
        String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
        System.out.println("排序前:" + Arrays.toString(stringArray));
        Arrays.sort(stringArray, String::compareToIgnoreCase);
        System.out.println("排序後:" + Arrays.toString(stringArray));

        // 構造器引用: ClassName::new
        Person newPerson = Person.create(Person::new);
        newPerson.setName("xiaocao");
        newPerson.setBirthday(LocalDate.of(1995, 8, 20));
        System.out.println(newPerson);
    }
}

點擊查看結果

排序前:[[Fred, 1980-06-20], [Jane, 1990-07-15], [George, 1991-08-13], [Bob, 2000-09-12]]
排序後:[[Bob, 2000-09-12], [Fred, 1980-06-20], [George, 1991-08-13], [Jane, 1990-07-15]]
排序前:[[Bob, 2000-09-12], [Fred, 1980-06-20], [George, 1991-08-13], [Jane, 1990-07-15]]
排序後:[[Fred, 1980-06-20], [Jane, 1990-07-15], [George, 1991-08-13], [Bob, 2000-09-12]]
排序前:[Barbara, James, Mary, John, Patricia, Robert, Michael, Linda]
排序後:[Barbara, James, John, Linda, Mary, Michael, Patricia, Robert]
[xiaocao, 1995-08-20]

參考鏈接:

  • https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
  • https://blog.csdn.net/yitian_66/article/details/81010434

Java 8 方法引用