java 8新特性(一)

Java 8出來有很長一段時間了,因爲以前一直在搞Ruby都沒時間好好學習下,趁着有空整理一下html

http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.htmljava

這裏咱們主要看編程語言相關的新特性:編程

Lambda表達式:

        如今的匿名類有一個問題就是,當一個匿名類的實現很是簡單,如一個接口只包含了惟一一個抽象方法,它的匿名類實如今解析的時候是笨重的且不清晰的。在這種狀況下,咱們一般會嘗試將功能的實現當作另外一個方法的參數傳入,好比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註解,若是不知足要求,如抽象方法多餘一個,就會編譯不過。

相關文章
相關標籤/搜索