Java1.8新特性

來源:互聯網
上載者:User

標籤:例子   文法   css   col   its   種類   編譯   style   ida   

1、Lambda運算式和函數式介面

Lambda運算式(也稱為閉包)是Java 8中最大和最令人期待的語言改變。它允許我們將函數當成參數傳遞給某個方法,或者把代碼本身當作資料處理:函數式開發人員非常熟悉這些概念。很多JVM平台上的語言(Groovy、Scala等)從誕生之日就支援Lambda運算式,但是Java開發人員沒有選擇,只能使用匿名內部類代替Lambda運算式。

Lambda的設計耗費了很多時間和很大的社區力量,最終找到一種折中的實現方案,可以實現簡潔而緊湊的語言結構。最簡單的Lambda運算式可由逗號分隔的參數列表、->符號和語句塊組成,例如:

Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );
2、介面的預設方法和靜態方法

 

Java 8使用兩個新概念擴充了介面的含義:預設方法和靜態方法。預設方法使得介面有點類似traits,不過要實現的目標不一樣。預設方法使得開發人員可以在 不破壞二進位相容性的前提下,往現存介面中添加新的方法,即不強制那些實現了該介面的類也同時實現這個新加的方法。

 

預設方法和抽象方法之間的區別在於抽象方法需要實現,而預設方法不需要。介面提供的預設方法會被介面的實作類別繼承或者覆寫,例子代碼如下:

 

private interface Defaulable {    // Interfaces now allow default methods, the implementer may or // may not implement (override) them. default String notRequired() { return "Default implementation"; } }private static class DefaultableImpl implements Defaulable {}private static class OverridableImpl implements Defaulable { @Override public String notRequired() { return "Overridden implementation"; }}

 

Defaulable介面使用關鍵字default定義了一個預設方法notRequired()。DefaultableImpl類實現了這個介面,同時預設繼承了這個介面中的預設方法;OverridableImpl類也實現了這個介面,但覆寫了該介面的預設方法,並提供了一個不同的實現。

 

Java 8帶來的另一個有趣的特性是在介面中可以定義靜態方法,例子代碼如下:

 

private interface DefaulableFactory {    // Interfaces now allow static methods    static Defaulable create( Supplier< Defaulable > supplier ) { return supplier.get(); }}

 

下面的程式碼片段整合了預設方法和靜態方法的使用情境:

 

public static void main( String[] args ) { Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new ); System.out.println( defaulable.notRequired() ); defaulable = DefaulableFactory.create( OverridableImpl::new ); System.out.println( defaulable.notRequired() );}

 

這段代碼的輸出結果如下:

 

Default implementationOverridden implementation

 

由於JVM上的預設方法的實現在位元組碼層面提供了支援,因此效率非常高。預設方法允許在不打破現有繼承體系的基礎上改進介面。該特性在官方庫中的應用是:給java.util.Collection介面添加新方法,如stream()、parallelStream()、forEach()和removeIf()等等。

儘管預設方法有這麼多好處,但在實際開發中應該謹慎使用:在複雜的繼承體系中,預設方法可能引起歧義和編譯錯誤。

 

3 、方法引用

方法引用使得開發人員可以直接引用現存的方法、Java類的構造方法或者執行個體對象。方法引用和Lambda運算式配合使用,使得java類的構造方法看起來緊湊而簡潔,沒有很多複雜的模板代碼。

西門的例子中,Car類是不同方法引用的例子,可以協助讀者區分四種類型的方法引用。

public static class Car {    public static Car create( final Supplier< Car > supplier ) { return supplier.get(); } public static void collide( final Car car ) { System.out.println( "Collided " + car.toString() ); } public void follow( final Car another ) { System.out.println( "Following the " + another.toString() ); } public void repair() { System.out.println( "Repaired " + this.toString() ); }}

第一種方法引用的類型是構造器引用,文法是Class::new,或者更一般的形式:Class<T>::new。注意:這個構造器沒有參數。

final Car car = Car.create( Car::new );final List< Car > cars = Arrays.asList( car );

第二種方法引用的類型是靜態方法引用,文法是Class::static_method。注意:這個方法接受一個Car類型的參數。

cars.forEach( Car::collide );

第三種方法引用的類型是某個類的成員方法的引用,文法是Class::method,注意,這個方法沒有定義入參:

cars.forEach( Car::repair );

第四種方法引用的類型是某個執行個體對象的成員方法的引用,文法是instance::method。注意:這個方法接受一個Car類型的參數:

final Car police = Car.create( Car::new );cars.forEach( police::follow );

運行上述例子,可以在控制台看到如下輸出(Car執行個體可能不同):

Collided com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197dRepaired com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197dFollowing the com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197d

 

Java1.8新特性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.