java8新特性(一)

java8新特性

大家好,我是酷酷的韓金羣~下面提供一些整理的java8新特性
java8新特性
一、接口的默認方法
Java 8允許我們給接口添加一個非抽象的方法實現,只需要使用 default關鍵字即可,這個特徵又叫做擴展方法,示例如下:

interface Formula {
    double calculate(int a);

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

Formula接口在擁有calculate方法之外同時還定義了sqrt方法,實現了Formula接口的子類只需要實現一個calculate方法,默認方法sqrt將在子類上可以直接使用。

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

formula.calculate(100);     // 100.0
formula.sqrt(16);           // 4.0

# 二.接口的靜態方法

在接口中,還允許定義靜態的方法。接口中的靜態方法可以直接用接口來調用。

例如,下面接口中定義了一個靜態方法 find,該方法可以直接用 StaticFunInterface .find() 來調用。

public interface StaticFunInterface {
public static int find(){
return 1;
}
}
public class TestStaticFun {
public static void main(String[] args){
//接口中定義了靜態方法 find 直接被調用
StaticFunInterface.fine();
}
}

三、函數式接口

Java 8 引入的一個核心概念是函數式接口(Functional Interfaces)。通過在接口裏面添加一個抽象方法,這些方法可以直接從接口中運行。如果一個接口定義個唯一一個抽象方法,那麼這個接口就成爲函數式接口。同時,引入了一個新的註解:@FunctionalInterface。可以把他它放在一個接口前,表示這個接口是一個函數式接口。這個註解是非必須的,只要接口只包含一個方法的接口,虛擬機會自動判斷,不過最好在接口上使用註解 @FunctionalInterface 進行聲明。在接口中添加了 @FunctionalInterface 的接口,只允許有一個抽象方法,否則編譯器也會報錯。
java.lang.Runnable 就是一個函數式接口。

@FunctionalInterface
public interface Runnable {
public abstract void run();
}

四、Lambda 表達式

函數式接口的重要屬性是:我們能夠使用 Lambda 實例化它們,Lambda 表達式讓你能夠將函數作爲方法參數,或者將代碼作爲數據對待。Lambda 表達式的引入給開發者帶來了不少優點:在 Java 8 之前,匿名內部類,監聽器和事件處理器的使用都顯得很冗長,代碼可讀性很差,Lambda 表達式的應用則使代碼變得更加緊湊,可讀性增強;Lambda 表達式使並行操作大集合變得很方便,可以充分發揮多核 CPU 的優勢,更易於爲多核處理器編寫代碼;

Lambda 表達式由三個部分組成:第一部分爲一個括號內用逗號分隔的形式參數,參數是函數式接口裏面方法的參數;第二部分爲一個箭頭符號:->;第三部分爲方法體,可以是表達式和代碼塊。語法如下:
(1)方法體爲表達式,該表達式的值作爲返回值返回。

(parameters) -> expression

(2)方法體爲代碼塊,必須用 {} 來包裹起來,且需要一個 return 返回值,但若函數式接口裏面方法返回值是 void,則無需返回值。

(parameters) ->{statements;}

(3)首先看看在老版本的Java中是如何排列字符串的:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

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

只需要給靜態方法 Collections.sort 傳入一個List對象以及一個比較器來按指定順序排列。通常做法都是創建一個匿名的比較器對象然後將其傳遞給sort方法。
(4)在新特性中提供了更簡潔的方法:

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

看到了吧,代碼變得更段且更具有可讀性,但是實際上還可以寫得更短:

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

對於函數體只有一行代碼的,你可以去掉大括號{}以及return關鍵字,但是你還可以寫得更短點:

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

最後使用還是要看大家的需求和習慣。

志在峯巔的攀登者,不會陶醉在沿途的某個腳印之中。------酷酷的韓金羣~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章