Java 8出來有很長一段時間了,因爲以前一直在搞Ruby都沒時間好好學習下,趁着有空整理一下html
http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.htmljava
這裏咱們主要看編程語言相關的新特性:編程
如今的匿名類有一個問題就是,當一個匿名類的實現很是簡單,如一個接口只包含了惟一一個抽象方法,它的匿名類實如今解析的時候是笨重的且不清晰的。在這種狀況下,咱們一般會嘗試將功能的實現當作另外一個方法的參數傳入,好比swing中當點擊一個按鈕,須要作的處理動做。Lambda表達式容許你這麼作,將功能做爲方法參數或者將代碼做爲數據。這個特性是屬於函數式編程的特性,將一個代碼塊做爲參數傳入,若是學習過ruby的哈應該很好理解,與ruby的lambda表達式很相似。下面看一下官方給出的例子(因爲例子太長,只展現重要部分,有興趣能夠本身去上面的地址看):ruby
沒有用Lambda表達式以前:oracle
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編譯器能夠根據方法定義自動推導出參數類型。ide
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註解,若是不知足要求,如抽象方法多餘一個,就會編譯不過。