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");