JAVA 8 特性

JAVA 8 新特性(1)

接口類的新寫法

在JAVA8中,我們可以用default關鍵詞在interface中添加非抽象類,也叫作 Extension Methods(擴展方法),例如

interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}

使用的時候,我們可以像下面這麼寫:

Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};
formula.calculate(100);     // 100.0
formula.sqrt(16);           // 4.0

Lambda表達式

首先,我們從看看怎麼給某個集合排序,

List<String> names = Arrays.asList("張三", "李四", "王五", "趙六");

Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

排序的寫法是不是很複雜?

讓我們來改進一下,

Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

還可以更短

Collections.sort(names, (String a, String b) -> b.compareTo(a));

或者再短一點:

Collections.sort(names, (a, b) -> b.compareTo(a));

自己寫函數式接口

每個Lambda方法都對應了接口中的某個類型,以此來通過JAVA的類型檢測系統。所以,每個函數式接口必須只包含一個抽象方法,例如:

@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}

調用的時候,我們只要這麼寫

Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);    // 123

注意,即使去掉@FunctionalInterface的註解,後面的程序也可以運行。

方法和構造器的引用

通過靜態方法引用,上面的程序還可以進一步簡化,如

Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);   // 123

注意,這裏用的是::

還可以引用類中的方法,例如

class Something {
    String startsWith(String s) {
        return String.valueOf(s.charAt(0));
    }
}

調用方法如下:

Something something = new Something();
Converter<String, String> converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);    // "J"

接下來,我們看看:: 怎麼捏合構造器,看下面的代碼

class Person {
    String firstName;
    String lastName;

    Person() {}

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

然後,我們寫一個工廠類,

interface PersonFactory<P extends Person> {
    P create(String firstName, String lastName);
}

通過構造器引用,我們可以把這兩個方法揉在一起:

PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章