標籤:
Java 8出來有很長一段時間了,由於之前一直在搞Ruby都沒時間好好學習下,趁著有空整理一下
http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
這裡我們主要看程式設計語言相關的新特性:
Lambda運算式:
現在的匿名類有一個問題就是,當一個匿名類的實現非常簡單,如一個介面只包含了唯一一個抽象方法,它的匿名類實現在解析的時候是笨重的且不清晰的。在這種情況下,我們通常會嘗試將功能的實現當做另一個方法的參數傳入,比如swing中當點擊一個按鈕,需要做的處理動作。Lambda運算式允許你這麼做,將功能作為方法參數或者將代碼作為資料。這個特性是屬於函數式編程的特性,將一個代碼塊作為參數傳入,如果學習過ruby的哈應該很好理解,與ruby的lambda運算式很類似。下面看一下官方給出的例子(由於例子太長,只展示重要部分,有興趣可以自己去上面的地址看):
沒有用Lambda運算式之前:
printPersons( roster, new CheckPerson() { public boolean test(Person p) { return p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25; } });
用了之後:
printPersons( roster, (Person p) -> p.getGender() == Person.Sex.MALE && p.getAge() >= 18 && p.getAge() <= 25);
可以看出用了Lambda之後字需要給出方法實現的代碼即可,簡潔了不少,代碼嵌套也少了兩層,如果實現代碼有多行時,需要在 ->後面使用{}同時最後必須有return,同時參數的類型也可以省略,Java編譯器可以根據方法定義自動推匯出參數類型。
介面的預設方法:
Java 8 允許在介面中定義非抽象的方法,需要用關鍵字default,叫做介面的預設方法或者擴充方法,這種方法可以定義多個。
具體代碼如下:
public interface Parser { String getResult(String info); default String notKnow() { return "Sorry I do‘t know!"; } default String anotherOne() { return "another one"; }}
public class AgeParser implements Parser { @Override public String getResult(String info) { if (info.matches("How old are you")) { return "I‘m 23"; } else { return notKnow(); } } public static void main(String[] args) { AgeParser parser = new AgeParser(); System.out.println(parser.getResult("How old are you")); System.out.println(parser.getResult("You do‘t know")); System.out.println(parser.anotherOne()); }}
預設方法在介面的實作類別中可以直接使用不需要重寫,當然也是可以在實作類別中重寫這個方法的,同時,如果其他的介面繼承了這個介面,那麼預設方法也會被繼承,同時可以在介面中重寫預設方法。
函數式介面:
在上面Lambda運算式中,曾提出過一個介面只包含了唯一一個抽象方法(可以同時包含多個預設方法),這個介面被叫做函數式介面,也只有函數式介面才能使用Lambda運算式建立其對應的匿名內部類的執行個體,同時為了確保介面一定滿足函數式介面的要求,可以在介面申明的上面加上@FunctionalInterface註解,如果不滿足要求,如抽象方法多餘一個,就會編譯不過。
java 8新特性(一)